鉴于以下控制,如何修改它以接受“运行”文本?
自定义控制:
[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>
答案 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
显然,样式可以在其他地方声明。