Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 何时呈现自定义WPF文本块?_C#_Wpf_Rendering_Textblock - Fatal编程技术网

C# 何时呈现自定义WPF文本块?

C# 何时呈现自定义WPF文本块?,c#,wpf,rendering,textblock,C#,Wpf,Rendering,Textblock,我应该什么时候在文本块中构建内联线?我有一个TextBlock派生类,当在某个字段中给定文本时,将其称为MyText,当MyText发生更改时,将文本转换为一组内联线 每当MyText发生更改时,我都会清除内联并构建它们,根据需要为每个单词着色。对于此示例,请考虑: private void MyTextBlock_MyTextChanged(object sender, EventArgs e) { Inlines.Clear(); if (!string.IsNullOrEm

我应该什么时候在文本块中构建内联线?我有一个TextBlock派生类,当在某个字段中给定文本时,将其称为MyText,当MyText发生更改时,将文本转换为一组内联线

每当MyText发生更改时,我都会清除内联并构建它们,根据需要为每个单词着色。对于此示例,请考虑:

private void MyTextBlock_MyTextChanged(object sender, EventArgs e)
{
    Inlines.Clear();
    if (!string.IsNullOrEmpty(this.MyText))
    {
        var run = new Run();
        run.Foreground = Brushes.DarkRed;
        run.Text = this.MyText;
        Inlines.Add(run);
    }
}
这项工作非常有效。然而,最近我们将控件放入数据网格中,一些奇怪的事情开始发生。显然,DataGrid交换了上下文,在大多数情况下,这是可行的。然而,当我们从DataGrid ItemsSource中添加或删除数据时,出现了一些错误,TextChanged似乎没有被调用,或者至少没有被同时调用。MyText可以是一个值,内联线可以是空的,也可以是不同的值

我认为构建内联线的位置不是在MyTextChange期间,而是在控件开始呈现时。当DataContextChange时,我也尝试过,但这没有帮助

在我的构造函数中,我有

   this.myTextDescriptor = DependencyPropertyDescriptor.FromProperty(
        MyTextProperty, typeof(MyTextBlock));
    if (this.myTextDescriptor != null)
    {
        this.myTextDescriptor.AddValueChanged(this, this.MyTextBlock_MyTextChanged);
    }
对应于类中的依赖项属性

    public string MyText
    {
        get { return (string)GetValue(MyTextProperty); }
        set { SetValue(MyTextProperty, value); }
    }

    public static readonly DependencyProperty MyTextProperty =
        DependencyProperty.Register("MyText", typeof(string), typeof(MyTextBlock));

    private readonly DependencyPropertyDescriptor myTextDescriptor;
更新:如果有任何线索的话,问题的DataGrid单元格似乎是那些在添加或删除时不在屏幕上的单元格。我也尝试了一个应用程序模板,但没有帮助


更新2:也许更好的解决方案是创建可绑定的内联线?

数据网格将其内容虚拟化,因此如果一行不可见,则不会加载该行。在这种情况下,您是否也尝试过在事件触发时重建内联线