データバインディングプロパティを使用して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を使用しています)で修正されたバグを参照しているようです。
しかし、あなたは集合新しいもので 'var td = TextDeco.Clone(); td.Add(TextDecorations.Strikethrough); td.Add(TextDecorations.Underline); TextDeco = td; ' – Lennart