【问题标题】:CustomRichTextBox StrikeThrough TextDecorationCustomRichTextBox StrikeThrough TextDecoration
【发布时间】:2015-06-19 11:59:09
【问题描述】:

我想在我的自定义RichTextBox 中添加一个TextDecorations.Strikethrough 装饰按钮我正在使用下面的代码来添加和删除TextDecoration 问题是当我选择一个范围时我得到一个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 但我认为它非常清楚。

谁能给我一个解决方法?

【问题讨论】:

    标签: wpf richtextbox text-decorations


    【解决方案1】:

    问题是,如果您的完整文本没有用删除线装饰,您将收到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);
        }
    

    【讨论】:

    • 它有效。当我解决这个问题时,我使用了类似的东西。由于某种原因,我作为答案提供的链接已被删除。
    猜你喜欢
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 2018-06-02
    相关资源
    最近更新 更多