2013-03-29 75 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