我正在尝试创建一个TextBlock
控件,以某种方式格式化它绑定的文本。为此,我尝试使用派生自 TextBlock 的类的 CoerceValueCallback 添加必要的内联,然后忽略文本。就像是:
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。不管我tb.Inlines.Clear()
之前是否使用过,或者我是否尝试返回null
或string.Empty
.
这真的是一个 CLR 错误(就像错误文本所暗示的那样)还是我在这里做了一些愚蠢的事情?
编辑:
MDA 消息显示
检测到 FatalExecutionEngineError 消息:运行时遇到致命错误。错误地址位于线程 0x156c 上的 0xe7376797。错误代码为 0x80131623。此错误可能是 CLR 中的错误或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括 COM 互操作或 PInvoke 的用户封送错误,这可能会损坏堆栈。