0

我有一个自定义控件,我想告诉每个TextBlock内部使用TextBlock.TextTrimming = CharacterEllipsis,但我不想单独设置该属性。我的意思是即使后来用户定义了 aContentTemplate并将其放在我的自定义控件中并且ContentTemplate包括一些Textblocks,他们也应该自动设置TextBlock.TextTrimming = CharacterEllipsis

我怎么做?请问有什么帮助吗?

4

1 回答 1

3

您可以创建具有属性值继承的附加属性,并将其应用于您的自定义控件,例如在其构造函数中。只要目标对象是 TextBlock,附加属性就会将其值复制到目标对象。

public class CustomControl : ContentControl
{
    public CustomControl()
    {
        SetTextTrimming(this, TextTrimming.CharacterEllipsis);
    }

    public static readonly DependencyProperty TextTrimmingProperty =
        DependencyProperty.RegisterAttached(
            "TextTrimming", typeof(TextTrimming), typeof(CustomControl),
            new FrameworkPropertyMetadata(
                default(TextTrimming),
                FrameworkPropertyMetadataOptions.Inherits,
                TextTrimmingPropertyChanged));

    public static TextTrimming GetTextTrimming(DependencyObject obj)
    {
        return (TextTrimming)obj.GetValue(TextTrimmingProperty);
    }

    public static void SetTextTrimming(DependencyObject obj, TextTrimming value)
    {
        obj.SetValue(TextTrimmingProperty, value);
    }

    private static void TextTrimmingPropertyChanged(
        DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        var textBlock = obj as TextBlock;

        if (textBlock != null)
        {
            textBlock.TextTrimming = (TextTrimming)e.NewValue;
        }
    }
}

请注意,无需TextTrimming在派生控件类中定义此附加属性。你也可以在一个特殊的帮助类中定义它,它甚至不需要从 DependencyObject 派生。

该属性也适用于在其可视化树中使用 TextBox 的任何其他控件,例如标准 ContentControl:

<ContentControl local:CustomControl.TextTrimming="WordEllipsis"
                Content="Some sample text to be trimmed"/>
于 2012-12-18T12:37:19.157 回答