gpt4 book ai didi

c# - 通过 ComboBox 更改 RichTextBox Selection 的字体大小无法正常工作

转载 作者:行者123 更新时间:2023-11-30 12:30:37 27 4
gpt4 key购买 nike

我创建了一个非常简单的 WPF 窗口,它由一个包含一个 RichTextBox 和一个 ComboBox 的网格组成。我使用 ComboBox 来更改和查找 RichTextBox 选择的字体大小。

这是我的 XAML 的代码隐藏文件:

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();

// Add the font sizes.
for (var i = 1; i < 72; i++)
{
FontSize.Items.Add((double) i);
}
}

private void MyTextBox_SelectionChanged(object sender, RoutedEventArgs e)
{
// If the selection changes, update the font size in the ComboBox.
FontSize.SelectedValue = (double) MyTextBox.Selection.GetPropertyValue(TextBlock.FontSizeProperty);
}

private void FontSize_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
// If the selected size changes, change the size of the selection in the RichTextBox.
if (FontSize.SelectedItem != null)
MyTextBox.Selection.ApplyPropertyValue(TextBlock.FontSizeProperty, FontSize.SelectedItem);
}
}

这里有两件事:

  1. MyTextBox_SelectionChanged 使用选择的字体大小更新 ComboBox
  2. FontSize_SelectionChanged 更改所选内容的字体大小。

你可以看到下面的问题:

enter image description here

当我进行选择并更改字体大小时,它会完美地改变。但是当我点击另一个字体大小不同的文本时,它又变回来了。

是什么导致了这种行为?

编辑:这是 XAML 文件:

<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ComboBox x:Name="FontSize" HorizontalAlignment="Left" VerticalAlignment="Top" Width="497" Margin="10,10,0,0" SelectionChanged="FontSize_SelectionChanged"/>
<RichTextBox x:Name="MyTextBox" HorizontalAlignment="Left" Height="273" VerticalAlignment="Top" Width="497" Margin="10,37,0,0" RenderTransformOrigin="0.358,0.48" SelectionChanged="MyTextBox_SelectionChanged">
<FlowDocument>
<Paragraph>
<Run Text="RichTextBox"/>
</Paragraph>
</FlowDocument>
</RichTextBox>

</Grid>
</Window>

编辑 2:这是我在调试它时所做的简短解释:

  1. 有两个调试点,一个在MyTextBox_SelectionChanged,一个在FontSize_SelectionChanged
  2. 当我更改字体大小时,我单击 F5 并继续。
  3. 当我单击文本的另一部分(具有默认大小)时,将调用 MyTextBox_SelectionChangedSelection.Text 为空。
  4. 然后我再次继续并在调用 FontSize_SelectionChanged 时停止。但是 Selection.Text 仍然是空的,但我的旧选择“Rich”返回到旧字体大小。

编辑 3: Sams Teach Yourself WPF in 24 Hours 中提到了这个问题2008 年 7 月首次打印,第 135 页,“使文本编辑器按预期工作”,第 9 项。我不理解那里的解释并创建了一个简短示例来说明该特定问题。

最佳答案

似乎发生的情况是,当您单击以清除选择时,这会导致您的 TextBox.SelectionChanged 事件处理程序 (MyTextBox_SelectionChanged) 在 Selection 表示一个空选择(即,只是一个插入点)。您的处理程序使用空选择的字体大小设置组合框的 SelectedValue,即使选择为空,这也是一个非常合理的做法。 (插入点仍然有字体大小。)

当然,更改 SelectedValue 会导致您的 ComboBox.Selection 事件处理程序 (FontSize_SelectionChanged) 运行。并且由于该事件处理程序没有简单的方法来区分由用户选择新值引起的事件和由您的代码更改 SelectedValue 属性引起的事件,它继续并尝试修改选择的字体大小,在这种特殊情况下您可能不希望这样做。

即便如此,您仍会认为它没问题,因为选择是空的,而您只是试图将其字体大小设置为现有的字体大小。但奇怪的是:当您在这个空选择上调用 ApplyPropertyValue 时,它似乎为整个文档设置了 FontSize

因此效果是,当您单击以清除选择时,您的代码会将整个文档的字体大小设置为您单击时的字体大小。

我怀疑这是 ApplyPropertyValue 中的错误,因为只有当您最初选择的文本是通过从第一个字符开始从左向右拖动来选择时才会发生这种情况。再说一遍,如果您将格式应用于空选择,则行为意味着什么并不完全清楚。因此,这可能更像是调用未定义行为的情况,而不是在 WPF 中遇到明确的错误。

无论如何,解决这个问题的合理方法是修改您的组合框更改处理程序:

if (FontSize.SelectedItem != null && !MyTextBox.Selection.IsEmpty)
{
MyTextBox.Selection.ApplyPropertyValue(
TextBlock.FontSizeProperty, FontSize.SelectedItem);
}

如果选择非空,这只会尝试更改选择的字体大小。

关于c# - 通过 ComboBox 更改 RichTextBox Selection 的字体大小无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15712150/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com