我想将一个TextDecorations.Strikethrough装饰按钮添加到我的自定义RichTextBox中,我使用下面的代码来添加和删除TextDecoration。问题是,当我选择一个比划过的范围更大的范围并单击"StrikeThrough“按钮时,我将得到一个InvalidCastException: Unable to cast object of type 'MS.Internal.NamedObject' to type 'System.Windows.TextDecorationCollection'.。
我的代码
private void StrikeOutButton_Click(object sender, RoutedEventArgs e)
{
TextRange range = new TextRange(this.MyRichTextBox.Selection.Start,
this.MyRichTextBox.Selection.End);
TextDecorationCollection tdc =
(TextDecorationCollection)this.MyRichTextBox.
Selection.GetPropertyValue(Inline.TextDecorationsProperty);
/*
if (tdc == null || !tdc.Equals(TextDecorations.Strikethrough))
{
tdc = TextDecorations.Strikethrough;
}
else
{
tdc = new TextDecorationCollection();
}
* */
if (tdc == null || !tdc.Contains(TextDecorations.Strikethrough[0]))
{
tdc = TextDecorations.Strikethrough;
}
else
{
tdc = new TextDecorationCollection();
}
range.ApplyPropertyValue(Inline.TextDecorationsProperty, tdc);
}注释输出代码也不起作用。
我本来打算发ExceptionDetails的,但我觉得很清楚。
有人能给我一个解决办法吗?
发布于 2015-10-14 11:03:51
问题是,如果没有完整的文本,那么您将得到DependencyProperty.UnsetValue。
因此,您可以检查DependencyProperty.UnsetValue,在这种情况下只需应用删除。
我做了一个简短的测试,这个解决方案对我有用:
private void StrikeOutButton_Click(object sender, RoutedEventArgs e)
{
TextRange textRange = new TextRange(TextBox.Selection.Start, TextBox.Selection.End);
var currentTextDecoration = textRange.GetPropertyValue(Inline.TextDecorationsProperty);
TextDecorationCollection newTextDecoration;
if (currentTextDecoration != DependencyProperty.UnsetValue)
newTextDecoration = ((TextDecorationCollection)currentTextDecoration == TextDecorations.Strikethrough) ? new TextDecorationCollection() : TextDecorations.Strikethrough;
else
newTextDecoration = TextDecorations.Strikethrough;
textRange.ApplyPropertyValue(Inline.TextDecorationsProperty, newTextDecoration);
}https://stackoverflow.com/questions/30937620
复制相似问题