2013-03-29 71 views
4

我创建了一个非常简单的WPF窗口,其中包含一个网格,其中包含一个RichTextBox和一个ComboBox。我使用ComboBox来更改并查找RichTextBox选择的字体大小。通过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仍然是空的,但我的旧选择“富”返回到旧的字体大小。

编辑3:这个问题在Sams Teach Yourself WPF in 24 Hours第一次印刷2008年7月提到,第135页,“制作按预期文本编辑工作”,项目9.我不明白的解释有创造一个说明具体问题的简短例子。

+0

您发布的代码片段不会导致您提到的问题(至少在我的机器上)。所以这是导致问题的其他代码。另外,MyTextBox_SelectionChanged代码存在一个不同的问题。如果用户选择一个具有多种字体大小的文本(例如RichTex),它会抛出异常。 – publicgk

+0

@publicgk:没有其他代码可以导致问题。有'MainWindow.xaml',它有一个名为'FontSize'的ComboBox,并且有一个名为'MyTextBox'的RichTextBox。而我所发布的是'MainWindow.xaml.cs'文件中除命名空间声明外的所有内容。它不会导致任何问题,因为这个问题在我正在阅读的书中提到。我无法理解这本书中的解释,所以这就是我在这里问的原因。 – hattenn

+0

@publicgk:你提到的另一个问题不是问题,因为我专门写了这段代码来提到这个问题。这不是为了处理除此之外的其他任何情况。 – hattenn

回答

2

什么似乎是发生的是,当您单击以清除选择,这会导致在Selection代表一个空的选择(即,只是一个插入点)要调用您TextBox.SelectionChanged事件处理(MyTextBox_SelectionChanged)。您的处理程序使用空白选择的字体大小来设置组合框的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); 
} 

这只企图改变选择的字体大小,如果选择非空。

+0

谢谢伊恩,我会在可能的情况下奖赏赏金(它不会让我再做15个小时)。顺便说一句,无论我在系统上进行选择的方向如何,都会出现问题,而不仅仅是从左到右。 – hattenn

0

当您选择您的文本,然后更改菜单上的大小,即使您不再看到选择,您的代码仍然被选中,现在当您选择代码SelectionChanged方法触发MyTextBoxSelection更改之前,(我只是猜测/相信,我认为我曾经有过这样的问题)。现在您更改您的Fontsize和Fontsize方法,它会访问未更新的选区,使您的最后更改无效。

+0

但我用调试点检查'Selection',它看起来是空的。为什么它仍然会改变? – hattenn