2013-04-17 6 views
1

TextBlock 컨트롤을 만들려고하는데 어떤 방식 으로든 바인딩 된 텍스트의 서식을 지정합니다. 이를 달성하기 위해 TextBlock에서 파생 된 클래스의 CoerceValueCallback을 사용하여 필요한 인라인을 추가 한 다음 텍스트를 무시하려고했습니다. 뭔가 같은 : 이제TextBlock의 CoerceValueCallback에 인라인을 추가 할 때 FatalExecutionEngineError

public class BuggyTextBlock : TextBlock 
{ 
    static BuggyTextBlock() 
    { 
     TextProperty.OverrideMetadata(typeof(BuggyTextBlock), 
         new FrameworkPropertyMetadata((PropertyChangedCallback)null, 
                CoerceText)); 
    } 

    private static object CoerceText(DependencyObject sender, object value) 
    { 
     BuggyTextBlock tb= (BuggyTextBlock)sender;      
     tb.Inlines.Add(new Run("Hello World")); // FatalExecutionEngineError here 
     return string.Empty; 
    } 
} 

, 나는 최대한 빨리 Text 속성을 (직접 또는 데이터 바인딩에 의해) 나는 FatalExecutionEngineError를 얻을 수의 변화에 ​​따라이 컨트롤을 사용하는 경우. 이전에 을 사용했거나 null 또는 string.Empty을 반환하려고하는 경우 중요하지 않습니다.

정말 이건 CLR 버그입니까 (오류 텍스트가 암시하는 것처럼)인가요? 아니면 내가 바보 같은 짓을하고있는 것입니까?

편집 :

MDA의 메시지가 FatalExecutionEngineError는 메시지를 검출되었다

읽 런타임은 치명적인 오류가 발생했습니다. 오류의 주소는 0x156c의 0xe7376797, 입니다. 오류 코드는 0x80131623입니다. 이 오류는 CLR에서 버그이거나 사용자 코드의 안전하지 않거나 확인할 수없는 부분 일 수 있습니다. 이 버그의 일반적인 소스에는 COM-interop 또는 PInvoke에 대한 사용자 마샬링 오류가 포함되어 스택을 손상시킬 수 있습니다.

+0

시도'this.Inlines.Add (새 실행 ("안녕하세요")) 할 수도 경우는' – WiiMaxx

+0

SRY 내가 이상 – WiiMaxx

+0

내 나쁜 정적 보았습니다을 스택 트랙을 제공해 주시겠습니까? – WiiMaxx

답변

1

MainWindow를

XAML

xmlns:obj='clr-namespace:Jens' 
Height="350" Width="525" Loaded="Window_Loaded"> 

<obj:BuggyTextBlock Background="Gray" Width="100" Height="50" x:Name="myBug"> 

</obj:BuggyTextBlock> 

숨김 코드

public MainWindow() 
    { 
     InitializeComponent(); 
     myBug.Text = "blubb"; 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 

     myBug.Text = "new blubb"; 
    } 

코드

public class BuggyTextBlock : TextBlock 
{ 
    static BuggyTextBlock() 
    { 
     TextProperty.OverrideMetadata(typeof(BuggyTextBlock), 
         new FrameworkPropertyMetadata((PropertyChangedCallback)null, 
                CoerceText)); 
    } 

    private static object CoerceText(DependencyObject sender, object value) 
    { 
     // 1. value == blubb 
     // 2. value == new blubb 
     // and here it comes i don't know why but it get called 3 Times 
     // 3. value == Hello WorldHello World <-- FatalExecutionEngineError here 

     BuggyTextBlock tb = (BuggyTextBlock)sender; 
     tb.Inlines.Add(new Run("Hello World")); // FatalExecutionEngineError here 
     return string.Empty; 
    } 
} 

편집 당신은

private static object CoerceText(DependencyObject sender, object value) 
    { 
     BuggyTextBlock tb = (BuggyTextBlock)sender; 

     tb.Text = value //<- watch here you will get a StackOverflowException 

     return string.Empty; 
    } 
+0

니스 찾기! 인라인을 추가하면 TextProperties CoerceCallback이 호출되는 것 같습니다. 나는 그것을 기대하지 않았다. – Jens

+0

그게 전부입니다. 추가 호출을 무시하면 (현재 업데이트중인 TextBlock을 HashSet에 추가하고 이미 값이 있으면 반환 함) 내 컨트롤이 제대로 작동합니다. 이제 합당한 오류 메시지를 보내지 않는 이유는 무엇입니까? =) – Jens

+0

@Jens 이것은 [link] (http://social.msdn.microsoft.com/forums/en-US/wpf/thread/c4d2428c-a5bd-4688-af13-ee87bf804fc3/) 도움이 될 수도 있습니다. – WiiMaxx

관련 문제