如果我的菜单定义如下:
<Menu>
<MenuItem Header="Stuff" />
</Menu>
当呈现它时,MenuItem内的ContentPresenter最终会得到如下内容:
<TextBlock Text="{Binding}" />
这意味着它继承了TextBlock的默认样式,这并不总是令人满意的。
我知道我可以将我的MenuItem更改为:
<MenuItem>
<MenuItem.Header>
<TextBlock Text="Stuff" Style="{DynamiResource MyStyle}" />
</MenuItem.Header>
</MenuItem>
但这将是一个烦人的要求。
我知道我可以覆盖MenuItem的默认样式来明确设置ContentTemplate,但这意味着如果内容不是String,或者MenuItem的特定实例指定了ContentTemplate,我的默认样式会覆盖 - 这会很糟糕。
我知道在WPF魔术的某个地方,有一个转换器或类似String类型的内容并创建一个使用TextBlock的DataTemplate,但我无法找到它的位置。我认为必须有某种方法来拦截这种魔法,但由于我找不到魔法发生的地方,我无法弄清楚如何拦截它。
有什么想法吗?
David Mullin
答案 0 :(得分:1)
您可以让DataTemplateSelector返回字符串的自定义模板,但只返回所有其他类型的默认模板。
public class MenuStringDataTemplateSelector : DataTemplateSelector
{
public override DataTemplate
SelectTemplate(object item, DependencyObject container)
{
if(item is string)
//TODO return your template
return base.SelectTemplate(item, container);
}
}