簡體   English   中英

通過組合框更改RichTextBox選擇的字體大小無法正常工作

[英]Changing the font size of a RichTextBox Selection through a ComboBox doesn't work properly

我創建了一個非常簡單的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更改所選內容的字體大小。

您可以看到以下問題:

在此處輸入圖片說明

當我進行選擇並更改字體大小時,它會完美變化。 但是,當我單擊另一種具有不同字體大小的文本時,它會再次變回原來的狀態。

是什么導致此行為?

編輯:這是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_SelectionChanged Selection.Text為空。
  4. 然后,我再次繼續並停止調用FontSize_SelectionChanged 但是Selection.Text仍然為空,但是我的舊選擇“ Rich”返回到舊字體大小。

編輯3:此問題在2008年7月第一次印刷的《 薩姆斯自學WPF》(第24頁)第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);
}

如果選擇為非空,則僅嘗試更改選擇的字體大小。

當您選擇文本,然后在菜單上更改大小時,即使您再也看不到選擇內容,您的代碼仍會被選中,現在,當您選擇代碼時,在MyTextBoxSelection更改之前,SelectionChanged方法將觸發((我只是猜想/相信我曾經有過這樣的問題)。 現在,您更改了Fontsize,並觸發了Fontsize方法,該方法將訪問未更新的Selection,從而使上一次更改無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM