如何解决将 RichTextBox 的 SelectionChanged 事件和 FontSize 的组合框的 TextChanged 事件一起使用会引发 DependencyProperty.UnsetValue 错误
我正在编写有关 WPF RichTextBox (RTB)
的 this 教程。遵循该教程中的两个事件会在场景中引发 DependencyProperty.UnsetValue
错误,如下所示:
场景:当我更改 RichTextBox (RTB)
中任意两个单词的字体大小时,当我在 RTB 中手动选择这两个单词时,我得到 DependencyProperty.UnsetValue
如下所示的 cmbFontSize_TextChanged(...)
事件中的错误。但是,如果我删除 RTB 的 SelectionChanged
事件(如下所示)或注释掉 SelectionChanged 事件的最后两行(与字体大小有关),则不会发生错误。
问题:我们是否真的需要以下 SelectionChanged
事件的最后两行(与字体大小相关) - 或者,我们还能如何解决该问题?我测试过,如果没有这两行,应用程序成功地更改了任何选定文本的字体大小(即使它有不同字体大小的单词)并且不会在 DependencyProperty.UnsetValue
事件中抛出 cmbFontSize_TextChanged(...)
错误。
备注:我已经上传了这个场景的最小示例 here。如何测试:在 RTB 上,复制/粘贴:Word1 and Word2 in one sentence.
将 Word2 的大小更改为不同的大小(例如 16)。当您选择 Word1 and Word2
部分时,您将收到以下错误:
MainWindow.xaml
<Window x:Class="WpfApp_Test4RTB.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp_Test4RTB"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<DockPanel>
<ToolBar DockPanel.Dock="Top">
<TextBlock Text="Font Size:"/>
<ComboBox Name="cmbFontSize" Width="50" IsEditable="True" TextBoxBase.TextChanged="cmbFontSize_TextChanged" />
</ToolBar>
<RichTextBox Name="rtbEditor" SelectionChanged="rtbEditor_SelectionChanged" />
</DockPanel>
</Window>
MainWindow.xaml.cs
public MainWindow()
{
InitializeComponent();
cmbFontSize.ItemsSource = new List<double>() { 8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72 };
cmbFontSize.SelectedIndex = 4;
}
private void rtbEditor_SelectionChanged(object sender,RoutedEventArgs e)
{
object temp = rtbEditor.Selection.GetPropertyValue(Inline.FontWeightProperty);
btnBold.IsChecked = (temp != DependencyProperty.UnsetValue) && (temp.Equals(FontWeights.Bold));
temp = rtbEditor.Selection.GetPropertyValue(Inline.FontStyleProperty);
btnItalic.IsChecked = (temp != DependencyProperty.UnsetValue) && (temp.Equals(FontStyles.Italic));
temp = rtbEditor.Selection.GetPropertyValue(Inline.TextDecorationsProperty);
btnUnderline.IsChecked = (temp != DependencyProperty.UnsetValue) && (temp.Equals(TextDecorations.Underline));
temp = rtbEditor.Selection.GetPropertyValue(Inline.FontFamilyProperty);
cmbFontFamily.SelectedItem = temp;
temp = rtbEditor.Selection.GetPropertyValue(Inline.FontSizeProperty);
cmbFontSize.Text = temp.ToString();
}
private void cmbFontSize_TextChanged(object sender,TextChangedEventArgs e)
{
rtbEditor.Selection.ApplyPropertyValue(TextElement.FontSizeProperty,cmbFontSize.Text);
}
解决方法
问题不在于事件。
您想为 double 属性分配一个字符串类型的值。
尝试在代码中执行 double num =" 12.34 ";
- 会出现错误。
您正在尝试在这里做同样的事情。
其实错误信息里面写的很详细。
在将字符串分配给数值变量或属性之前,必须先对其进行转换。
但是在您的任务中,这是毫无意义的,因为您正在从双重集合中获取值。
只需检查是否进行了选择,如果是,则分配所选值。
private void cmbFontSize_TextChanged(object sender,TextChangedEventArgs e)
{
if(cmbFontSize.SelectedItem is double number)
rtbEditor.Selection.ApplyPropertyValue(TextElement.FontSizeProperty,number);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。