2010-07-28 2 views
0

Я задумал, как элементы отображаются в меню, но по неизвестной причине у меня возникли проблемы с отображением всего текста в MenuItem. Вот снимок экрана проблемы: alt text http://img203.imageshack.us/img203/4513/capturexz.pngТекст заголовка WPF MenuItem частично скрыт

Вот код разметки Я использовал шаблон его:

<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}"/> 

Я искал много, но ничто не помогло решить эту проблему. Надеюсь, я найду помощь здесь.

Спасибо.

+0

Вы можете попробовать Ширина для MenuItem – Ragunathan

+0

Это показывает мне немного больше текста, но это только потому, что элемент длиннее. На правой стороне все еще есть вид отсечения. – Ucodia

+0

Попытайтесь поближе к меню – Ragunathan

ответ

1

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

Вместо этого вы хотите установить ItemContainerStyle. Это позволит вам установить свойства в MenuItems, созданные в меню. Существует один трюк, который вам нужно использовать, чтобы вы могли создать отдельный объект изображения для каждого элемента MenuItem. По умолчанию объекты, включенные в стиль, будут совместно использоваться, и вы получите один объект Image, общий для каждого MenuIte, но если вы поместите их в отдельный словарь ресурсов, вы можете пометить их как не разделяемые. См. this issue on Connect и linked 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> 
+0

Молодцы! Это работает очень хорошо. Но это заставило меня понять, что поведение стиля может привести к действительно странному побочному эффекту. Поскольку это поведение, связанное со стилем, кажется, что у меня нет другого решения. Я не очень ценю тот факт, что мне понадобится выделенный ресурс для этого, поэтому я просто добавил ресурс Image в свой текущий ResourceDictionary. – Ucodia

 Смежные вопросы

  • Нет связанных вопросов^_^