0

私はカスタムコントロールを持っていて、すべてTextBlockの内部に使用するように伝えTextBlock.TextTrimming = CharacterEllipsisたいのですが、そのプロパティをそれぞれに個別に設定したくありません。つまり、後でユーザーがaを定義し、ContentTemplateそれをカスタムコントロール内に配置し、それに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 に答える