![](/img/trans.png)
[英]WPF - RichTextBox font size won't change if I click in RichTextBox after changing size
[英]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);
}
}
這里有兩件事:
MyTextBox_SelectionChanged
用選擇的字體大小更新ComboBox
。 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:這是我調試時所做的簡短說明:
MyTextBox_SelectionChanged
,另一個在FontSize_SelectionChanged
。 MyTextBox_SelectionChanged
。 Selection.Text
為空。 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.