wpf 是否有正确的方法来处理DataGridTemplateColumn TextBlock中的内联?

slsn1g29  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(107)

我使用TextBlockFormatter突出显示DataGridTemplateColumn -〉TextBlock中的文本的特定部分
DataGridTemplateColumn

<DataGridTemplateColumn Width="2.5*" Header="{DynamicResource TEXT}" >
    <DataGridTemplateColumn.CellTemplate>
         <DataTemplate>
             <TextBlock base:TextBlockFormatter.FormattedText="{Binding prettyText}"                   TextWrapping="Wrap" />
         </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

TextBlockFormatter:

public class TextBlockFormatter
{
    public static readonly DependencyProperty FormattedTextProperty = DependencyProperty.RegisterAttached(
        "FormattedText",
        typeof(string),
        typeof(RequestTextBlockFormatter),
        new FrameworkPropertyMetadata(null, OnFormattedTextChanged));

    public static void SetFormattedText(UIElement element, string value)
    {
        element.SetValue(FormattedTextProperty, value);
    }

    private static void OnFormattedTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        TextBlock textblock = (TextBlock)d;
        //textblock.Inlines.Clear();
        List<SplitText> splitTexts = TranslationActions.getSplitetTextFromString(e.NewValue.ToString());

        Color textColor = SomeColor;

        foreach (SplitText splitText in splitTexts)
        {
            FontWeight fontWeight = Convert.ToBoolean(splitText.isBold) ? FontWeights.Bold : FontWeights.Normal;
            FontStyle fontStyle = splitText.isItalic ? FontStyles.Italic : FontStyles.Normal;
                
            if(splitText.isColor) 
            {
                textblock.Inlines.Add(new Run(splitText.text){Foreground = new SolidColorBrush(textColor), FontWeight = fontWeight,FontStyle = fontStyle });
            }
            else
            {
                textblock.Inlines.Add(new Run(splitText.text){FontWeight = fontWeight,FontStyle = fontStyle });
            }
       }
    }
}

在DataGrid中大约12行之后,TextBlock已经有了内联并开始重复数据。有没有一种方法可以防止这种情况,而不必每次都清除内联?

evrscar2

evrscar21#

要么你必须每次都从头开始构建新的Run(通过清除textblock.Inlines),要么你必须将新的格式化文本与旧的进行比较,只修改需要修改的内容--这是一项复杂得多的任务。

相关问题