何时呈现自定义WPF TextBlock?

时间:2011-06-04 23:42:46

标签: c# wpf rendering textblock

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

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

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);
    }
}

这非常有效。但是,最近我们将Control放入DataGrid,并且一些奇怪的事情已经开始发生。显然,DataGrid交换了上下文,并且大多数情况下这都有效。但是,当我们从DataGrid ItemsSource添加或删除数据时,出现问题,而TextChanged似乎不会被调用(或者至少不会同时调用)。 MyText可以是一个值,Inlines可以是空白或不同的值。

我认为构建Inlines的地方不是在MyTextChanged期间,而是在Control的渲染开始时。我也曾尝试过DataContextChanged,但这没有用。

在我的构造函数中,我有

   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单元格似乎是在添加或删除发生时屏幕外的问题。我也试过OnApplyTemplate,但这没有帮助。

Update2:也许更好的解决方案可能是创建可绑定的内联?

1 个答案:

答案 0 :(得分:0)

DataGrids虚拟化其内容,因此如果一行不可见,则不会加载。在这种情况下,您是否尝试在Loaded事件触发时重建内联?