如何创建接受<run> text?</run>的自定义控件

时间:2013-11-18 22:52:49

标签: c# wpf

鉴于以下控制,如何修改它以接受“运行”文本?

自定义控制:

[ContentProperty("Text")]
public class GradientTitle : Control
{
    public GradientTitle()
    {
        this.DefaultStyleKey = typeof(GradientTitle);
    }

    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }
    public static readonly DependencyProperty TextProperty =
       DependencyProperty.Register("Text", typeof(string), typeof(GradientTitle), new PropertyMetadata(null));
}

预期用途:

        <customControls:GradientTitle>
                <Run Text="The quick brown fox" />
                <Run Text="jumps over the lazy dog" />
                <Run Text="{Binding SomeText}" />
        </customControls:GradientTitle>

1 个答案:

答案 0 :(得分:2)

你可能不应该这样做,因为TextBlock已经做到了,但无论如何:

[ContentProperty("Inlines")]
[TemplatePart(Name = "PART_InlinesPresenter", Type = typeof(TextBlock))]
public class GradientTitle : Control
{
    private readonly Collection<Inline> _inlines = new Collection<Inline>();

    public Collection<Inline> Inlines
    {
        get { return _inlines; }
    }

    static GradientTitle()
    {
        DefaultStyleKeyProperty.OverrideMetadata(
            typeof(GradientTitle),
            new FrameworkPropertyMetadata(typeof(GradientTitle)));
    }

    public override void OnApplyTemplate()
    {
        base.ApplyTemplate();

        var inlinesPresenter = GetTemplateChild("PART_InlinesPresenter") as TextBlock;
        if(inlinesPresenter != null)
        {
            var targetInlines = inlinesPresenter.Inlines;
            foreach(var inline in Inlines)
            {
                targetInlines.Add(inline);
            }
        }
    }
}

为简化解决方案,我使用TextBlock呈现内联对象并将Inlines声明为简单(非依赖)属性(几乎与TextBlock一样 - 它是{{1没有一些外部帮助,属性是不可绑定的)。此外,我不跟踪任何集合更改。如果需要,可以添加所有这些缺失的功能,但需要太多代码才能得到简单的答案。

XAML中的用法:

Inlines

显然,样式可以在其他地方声明。