2010-09-26 55 views
0

如果我有这样定义的菜单:需要覆盖默认的ContentTemplate字符串内容

<TextBlock Text="{Binding}" /> 

<Menu> 
<MenuItem Header="Stuff" /> 
</Menu> 

当这个被渲染时,ContentPresenter里面的菜单项的,像这样的内容结束

这意味着它继承了TextBlock的默认样式,这并不总是可取的。

我知道,我可以改变我的菜单项是这样的:

<MenuItem> 
<MenuItem.Header> 
<TextBlock Text="Stuff" Style="{DynamiResource MyStyle}" /> 
</MenuItem.Header> 
</MenuItem> 

但是这将是一个恼人的要求。我知道我可以重写MenuItem的默认样式来明确设置ContentTemplate,但这意味着如果内容是一个字符串以外的东西,或者如果MenuItem的特定实例指定了一个ContentTemplate,我的默认值风格会覆盖 - 这会很糟糕。我知道,在WPF的魔力的某个地方,有一个转换器或东西,正在采取类型字符串的内容和创建使用TextBlock的DataTemplate,但我无法找到它在哪里。我认为必须有某种方法来拦截这种魔法,但由于我无法找到魔法发生的位置,我无法弄清楚如何拦截它。

任何想法?

大卫·穆林

回答

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);    
    } 
}