2016-12-12 20 views
0

データバインディングプロパティを使用してTextBlockにTextDecoration(例:取り消し線など)を追加しようとしています。TextBlockにTextDecorationをプログラムで追加すると、InvalidOperationExceptionが発生します。

最小例:

public partial class TextDecoTest : Window 
    { 
     public TextDecoTest() 
     { 
      DataContext = this; 
      InitializeComponent(); 
      TextDeco.Add(TextDecorations.Strikethrough); //Exception here 
     }  


     public TextDecorationCollection TextDeco 
     { 
      get { return (TextDecorationCollection)GetValue(TextDecoProperty); } 
      set { SetValue(TextDecoProperty, value); } 
     }  

     public static readonly DependencyProperty TextDecoProperty = 
      DependencyProperty.Register("TextDeco", typeof(TextDecorationCollection), typeof(TextDecoTest), new PropertyMetadata(new TextDecorationCollection())); 


    } 

XAML:

<Window> 
    <TextBlock Text="Test" TextDecorations="{Binding TextDeco}" /> 
</Window> 

しかし、TextDecorationを加えることで失敗:

タイプの指定された値 'System.Windows.TextDecorationCollection' マスト IsFrozenをfalseに設定して変更します。

わかりました。しかし、あなたはWPFのコントロールを実際に解凍することはできないので、私はちょっと困っています。私は新しいTextDecorationCollectionを作成し、デコレーションを追加してコレクション全体を置き換えると動作しますが、これは実際には実現可能ではなく、間違っていると感じます。 私はこの問題についていくつか言及しましたが、.NET 4.5(4.6.1を使用しています)で修正されたバグを参照しているようです。

答えて

0

TextDecorationsクラスの4つの静的プロパティはすでにタイプTextDecorationCollectionです。

public static TextDecorationCollection Strikethrough { get; } 

明らかにそれらは組み合わせることを意味しません。

だからではなく、あなたのTextDecoプロパティにそれらのいずれかを追加して、ちょうどこのようなプロパティ設定:あなたはしかし、このような2つのTextDecorationsを組み合わせてもよい

TextDeco = TextDecorations.Strikethrough; 

を:

TextDeco = new TextDecorationCollection(
    Enumerable.Concat(TextDecorations.Strikethrough, TextDecorations.Underline)); 

以上、で再帰的にConcatを呼び出す:

TextDeco = new TextDecorationCollection(
    Enumerable.Concat(TextDecorations.Strikethrough, 
     Enumerable.Concat(TextDecorations.Underline, TextDecorations.OverLine))); 
+0

しかし、あなたは集合新しいもので 'var td = TextDeco.Clone(); td.Add(TextDecorations.Strikethrough); td.Add(TextDecorations.Underline); TextDeco = td; ' – Lennart

関連する問題