WPF MenuItem标题文本被部分隐藏

时间:2010-07-28 09:55:10

标签: wpf templates menuitem

我模仿菜单中显示项目的方式,但由于未知原因,我在菜单项中显示整个文本时遇到问题。以下是问题的截屏: alt text http://img203.imageshack.us/img203/4513/capturexz.png

以下是我用来模板化的标记代码:

<ItemsPanelTemplate x:Key="SideBarItemsPanelTemplate">
    <StackPanel Orientation="Vertical"/>
</ItemsPanelTemplate>
<DataTemplate x:Key="SideBarItemTemplate">
    <MenuItem Command="{Binding}" Header="{Binding Text}" Background="AliceBlue">
        <MenuItem.Icon>
            <Image Width="16" Height="16" Source="{Binding Image}"/>
        </MenuItem.Icon>
    </MenuItem>
</DataTemplate>
<Style x:Key="SideBarStyle" TargetType="{x:Type Menu}">
    <Setter Property="ItemTemplate" Value="{StaticResource SideBarItemTemplate}"/>
    <Setter Property="ItemsPanel" Value="{StaticResource SideBarItemsPanelTemplate}"/>
    <Setter Property="Background" Value="White"/>
</Style>

并显示它:

<Menu ItemsSource="{Binding Commands}" Style="{StaticResource SideBarStyle}"/>

我搜索了很多,但没有任何帮助解决这个问题。希望我能在这里找到一些帮助。

感谢。

1 个答案:

答案 0 :(得分:1)

你得到了奇怪的行为,因为你在MenuItem中有一个MenuItem。通过在菜单上设置ItemTemplate,您将在每个MenuItem上设置HeaderTemplate。 MenuItem将呈现其正常模板,并且通常将放置标题文本的位置将具有整个其他MenuItem。我认为你看到的空间是外部MenuItem中为InputGestureText保留的空间。

相反,您想要设置ItemContainerStyle。这将允许您在菜单创建的MenuItem上设置属性。您需要使用一个技巧,以便为每个MenuItem创建单独的Image对象。默认情况下,样式中包含的对象将被共享,并且您将获得每个MenuIte共享的一个Image对象,但如果将它们放在单独的资源字典中,则可以将它们标记为不共享。请参阅this issue on Connectlinked workaround

这样的事情:

<Style x:Key="SideBarStyle" TargetType="{x:Type Menu}">
    <Setter Property="ItemsPanel" Value="{StaticResource SideBarItemsPanelTemplate}"/>
    <Setter Property="Background" Value="White"/>
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style TargetType="MenuItem">
                <Style.Resources>
                    <ResourceDictionary Source="Icon.xaml"/>
                </Style.Resources>
                <Setter Property="Command" Value="{Binding}"/>
                <Setter Property="Header" Value="{Binding Text}"/>
                <Setter Property="Background" Value="AliceBlue"/>
                <Setter Property="Icon" Value="{StaticResource Icon}"/>
            </Style>
        </Setter.Value>
    </Setter>
</Style>

Icon.xaml包含:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Image x:Key="Icon" x:Shared="False" Width="16" Height="16" Source="{Binding Image}"/>
</ResourceDictionary>