Текст заголовка WPF MenuItem частично скрыт - PullRequest
0 голосов
/ 28 июля 2010

Я настроил способ отображения элементов в меню, но по неизвестной причине у меня возникают проблемы с отображением всего текста в MenuItem.Вот скриншот проблемы: альтернативный текст 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 Ответ

1 голос
/ 28 июля 2010

Вы получаете странное поведение, потому что у вас есть MenuItem в MenuItem.Установив ItemTemplate в меню, вы устанавливаете HeaderTemplate для каждого MenuItem.MenuItem будет отображать свой обычный шаблон, и там, где обычно размещается текст заголовка, у него будет целый другой MenuItem.Я думаю, что пространство, которое вы видите, является пространством, зарезервированным для InputGestureText во внешнем MenuItem.

Вместо этого вы хотите установить ItemContainerStyle.Это позволит вам установить свойства для элементов меню, созданных меню.Есть один трюк, который вы должны использовать, чтобы вы могли создать отдельный объект Image для каждого MenuItem.По умолчанию объекты, включенные в стиль, будут общими, и вы получите один объект Image, общий для каждого MenuIte, но если вы поместите их в отдельный словарь ресурсов, вы можете пометить их как не общие.См. эту проблему для Connect и связанный обходной путь .

Примерно так:

<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>
...