2015-06-19 3 views
0

Я хочу, чтобы добавить кнопку в TextDecorations.Strikethrough украшение к моему обычаю RichTextBox я с помощью кода, приведенную ниже для добавления и удаления TextDecoration Дело в том, что я получаю InvalidCastException: Unable to cast object of type 'MS.Internal.NamedObject' to type 'System.Windows.TextDecorationCollection'. когда я выбрать диапазон больше, чем тот, который прошивается и нажимает кнопку «StrikeThrough».CustomRichTextBox зачеркивания TextDecoration

Мой код

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, но я думаю, что это очень ясно.

Может ли кто-нибудь предоставить мне обходной путь?

ответ

1

Проблема в том, что вы получите DependencyProperty.UnsetValue, если ваш полный текст не украшен Strikethrough или нет.

Таким образом, вы можете проверить на 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); 
    } 
+0

это работает. Я использовал что-то подобное, когда я исправил это. для somereason ссылка i, предоставленная в качестве ответа, была удалена. –

Смежные вопросы