【发布时间】:2012-01-05 07:34:56
【问题描述】:
我有一个 XAML 是这样的 Button
<Button x:Name="Button2" Style="{StaticResource User_Hyperlink_Button}" Tag="123456789.XAML" Width="86" Height="30" Margin="26,327,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Content="Button2" />
Button 的样式在 ResourceDictionary 中定义如下
<Style x:Key="User_Hyperlink_Button" TargetType="{x:Type Button}">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Button Style="{DynamicResource App_button}" >
<Hyperlink Style="{DynamicResource Button_LinkForeground}" NavigateUri="{Binding Path=Tag, RelativeSource={RelativeSource Mode=TemplatedParent, AncestorLevel=0}}">
<InlineUIContainer>
<TextBlock Text="{Binding Path=Content, RelativeSource={RelativeSource Mode=TemplatedParent, AncestorLevel=0}}" />
</InlineUIContainer>
</Hyperlink>
</Button>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
在这一切工作正常,但是当我对 MenuItem 执行相同操作时,MenuItem 的文本消失了。
MenuItem的xaml是这样的
<MenuItem x:Name="MenuItem1" Style="{StaticResource User_Hyperlink_MenuItem}" Tag="123456789.XAML" Header="MenuItem1" />
风格是这样的
<Style x:Key="User_Hyperlink_MenuItem" TargetType="{x:Type MenuItem}">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type MenuItem}">
<MenuItem Style="{DynamicResource App_MenuItem}" >
<Hyperlink Style="{DynamicResource Menu_LinkForeground}" NavigateUri="{Binding Path=Tag, RelativeSource={RelativeSource Mode=TemplatedParent, AncestorLevel=0}}">
<InlineUIContainer>
<TextBlock Text="{Binding Path=Header, RelativeSource={RelativeSource Mode=TemplatedParent, AncestorLevel=0}}" />
</InlineUIContainer>
</Hyperlink>
</MenuItem>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我也这样改过风格
...
<TextBlock Text="{Binding Path=Content, RelativeSource={RelativeSource Mode=TemplatedParent, AncestorLevel=0}}" />
...
但它不起作用。 我需要通过仅修改样式来解决此问题,并且由于某些限制而无法更改 MenuItem 的 xaml。
更新 1
我需要让 MenuItem 文本出现在上面。文本在 TextBlock 中,但其值来自 MenuItem 的 Content 属性。 MenuItem 没有 Content 属性,而是具有 Items Collection,这就是文本未显示的原因。而在 Button 的情况下,链接一切正常,文本全部。
我正在处理松散的 XAML,因此我必须使用超链接进行链接。无需担心递归或继承,因为它不是问题。问题只是 MenuItem 没有 Content 属性,所以需要通过获取 Item[0] 来解决这个问题。
更新 2
我也提供其他资源供参考
<Style x:Key="App_MenuItem" TargetType="{x:Type MenuItem}">
<Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
<Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
<Setter Property="Background" Value="#FF015DAB"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="Template" Value="{DynamicResource {ComponentResourceKey ResourceId=SubmenuItemTemplateKey, TypeInTargetAssembly={x:Type MenuItem}}}"/>
<Style.Triggers>
<Trigger Property="Role" Value="TopLevelHeader">
<Setter Property="Margin" Value="0,1,0,1"/>
<Setter Property="Padding" Value="6,3,6,3"/>
<Setter Property="Template" Value="{DynamicResource {ComponentResourceKey ResourceId=TopLevelHeaderTemplateKey, TypeInTargetAssembly={x:Type MenuItem}}}"/>
</Trigger>
<Trigger Property="Role" Value="TopLevelItem">
<Setter Property="Margin" Value="0,1,0,1"/>
<Setter Property="Padding" Value="6,3,6,3"/>
<Setter Property="Template" Value="{DynamicResource {ComponentResourceKey ResourceId=TopLevelItemTemplateKey, TypeInTargetAssembly={x:Type MenuItem}}}"/>
</Trigger>
<Trigger Property="Role" Value="SubmenuHeader">
<Setter Property="DockPanel.Dock" Value="Top"/>
<Setter Property="Padding" Value="0,2,0,2"/>
<Setter Property="Template" Value="{DynamicResource {ComponentResourceKey ResourceId=SubmenuHeaderTemplateKey, TypeInTargetAssembly={x:Type MenuItem}}}"/>
</Trigger>
<Trigger Property="Role" Value="SubmenuItem">
<Setter Property="DockPanel.Dock" Value="Top"/>
<Setter Property="Padding" Value="0,2,0,2"/>
</Trigger>
</Style.Triggers>
</Style>
<Style x:Key="Menu_LinkForeground" TargetType="{x:Type Hyperlink}">
<Setter Property="Foreground" Value="White" />
<Setter Property="TextDecorations" Value="None" />
</Style>
【问题讨论】:
-
你有所有的 DynamicResource 可用吗?
-
是的,所有资源都可用。
-
尝试用非常简单的东西代替你的 stule,比如没有绑定的 Button,看看它是否能把它捡起来。
-
该场景对 Buttons 非常有效,但对于 MenuItem 则不起作用。
-
:) 抱歉,我的意思是 - 如果您尝试将样式应用于 MenuItem,但从 ControlTemplate 中删除所有内容,只留下一个按钮。