2016-12-12 9 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 속성 중 하나를 추가하는 바로이 같은 속성을 설정 :

TextDeco = TextDecorations.Strikethrough; 

당신은 그러나이 같은 두 TextDecorations 결합 할 수 있습니다

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