2009-08-21 22 views
16

Bất cứ khi nào tôi đính kèm một DataTemplate vào một MenuItem, mỗi mục trình đơn được tạo ra sẽ có thêm một khoảng trống ở phía bên trái. Không gian thêm này trông rộng như không gian dành riêng cho séc, mà tôi sử dụng. Xây dựng trình đơn theo cách thủ công mà không có DataTemplate không thêm khoảng trống thừa này. Như một nếp nhăn thêm, nếu tôi bấm vào không gian thêm này mục trình đơn biến mất nhưng không có sự kiện nhấp chuột được tạo ra. Tôi không biết tại sao nó bổ sung thêm không gian này. Bất kỳ ý tưởng?Sử dụng DataTemplate cho MenuItem khiến không gian thừa ở bên trái xuất hiện?

mã XAML của tôi không thể đơn giản hơn:

menu với các không gian thêm mô tả:

<Menu> 
    <MenuItem Header="Enemies" ItemsSource="{Binding AvailableEnemyClasses}"> 
     <MenuItem.ItemTemplate> 
      <DataTemplate> 
       <MenuItem Header="{Binding}"> 
       </MenuItem> 
      </DataTemplate> 
     </MenuItem.ItemTemplate> 
    </MenuItem> 
</Menu> 

menu mà không cần thêm dấu cách:

<Menu> 
    <MenuItem Header="Utilities" > 
     <MenuItem Header="Enemy01"/> 
     <MenuItem Header="Enemy02"/> 
     <MenuItem Header="Enemy03"/> 
    </MenuItem> 
</Menu> 
+0

biết thêm: https://github.com/fluentribbon/Fluent.Ribbon/issues/ 188 – juFo

+0

và xem thêm: http://stackoverflow.com/questions/19965464/wpf-menuitem-icon-in-the-wrong-place-when-using-data-template?rq=1 – juFo

Trả lời

39

Nó bởi vì cây thị giác sản xuất bởi số DataTemplate của bạn sẽ được gói trong một thùng chứa - trong trường hợp này là MenuItem. Do đó, bạn thực sự có một số MenuItem trong một số MenuItem, giải thích khoảng trống thừa và thiếu sự tương tác. Không cần phải bao gồm MenuItem trong số ItemTemplate của bạn.

dụ của bạn thay vì có thể được viết như sau:

<Menu> 
    <MenuItem Header="Enemies" ItemsSource="{Binding AvailableEnemyClasses}"> 
     <MenuItem.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding}"/> 
      </DataTemplate> 
     </MenuItem.ItemTemplate> 
    </MenuItem> 
</Menu> 

Hoặc, có lẽ ngắn gọn hơn:

<Menu> 
    <MenuItem Header="Enemies" ItemsSource="{Binding AvailableEnemyClasses}"> 
     <MenuItem.ItemContainerStyle> 
      <Style TargetType="MenuItem"> 
       <Setter Property="Header" Value="{Binding}"/> 
       <Setter Property="IsChecked"> 
        <Setter.Value> 
         <MultiBinding Converter="{StaticResource YourConverter}"> 
          <Binding .../> 
          <Binding .../> 
         </MultiBinding> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </MenuItem.ItemContainerStyle> 
    </MenuItem> 
</Menu> 
+0

Cảm ơn câu trả lời của bạn! Tôi đã có một câu hỏi khác: Với một ItemContainerStyle, làm thế nào tôi sẽ ràng buộc tài sản IsChecked của MenuItem với một multibinding? – djcouchycouch

+0

Không sao cả. Đó có thể là một câu hỏi riêng, nhưng tôi đã cập nhật câu trả lời của tôi để cho bạn thấy làm thế nào. –

+0

Ah, bây giờ tôi hiểu. Cảm ơn Kent! – djcouchycouch

Các vấn đề liên quan