对 MenuItem 使用 DataTemplate 会导致左侧出现额外空间?
Posted
技术标签:
【中文标题】对 MenuItem 使用 DataTemplate 会导致左侧出现额外空间?【英文标题】:Using a DataTemplate for a MenuItem causes extra space on the left side to appear? 【发布时间】:2010-11-21 17:22:52 【问题描述】:每当我将 DataTemplate 附加到 MenuItem 时,每个生成的菜单项都会在左侧获得一个额外的空间。这个额外的空间看起来和我使用的为支票预留的空间一样宽。在没有 DataTemplate 的情况下手动构建菜单不会增加这个额外的空间。作为一个额外的皱纹,如果我点击这个额外的空间,菜单项就会消失,但不会生成点击事件。我不知道为什么要添加这个额外的空间。有什么想法吗?
我的 xaml 代码再简单不过了:
带有所述额外空格的菜单:
<Menu>
<MenuItem Header="Enemies" ItemsSource="Binding AvailableEnemyClasses">
<MenuItem.ItemTemplate>
<DataTemplate>
<MenuItem Header="Binding">
</MenuItem>
</DataTemplate>
</MenuItem.ItemTemplate>
</MenuItem>
</Menu>
没有多余空格的菜单:
<Menu>
<MenuItem Header="Utilities" >
<MenuItem Header="Enemy01"/>
<MenuItem Header="Enemy02"/>
<MenuItem Header="Enemy03"/>
</MenuItem>
</Menu>
【问题讨论】:
更多信息:github.com/fluentribbon/Fluent.Ribbon/issues/188 另见:***.com/questions/19965464/… 【参考方案1】:这是因为您的DataTemplate
生成的可视化树将被包装在一个容器中——在本例中为MenuItem
。因此,您实际上在MenuItem
中有一个MenuItem
,这说明了额外的空间和缺乏交互性。无需在您的ItemTemplate
中包含MenuItem
。
您的示例可能改为:
<Menu>
<MenuItem Header="Enemies" ItemsSource="Binding AvailableEnemyClasses">
<MenuItem.ItemTemplate>
<DataTemplate>
<TextBlock Text="Binding"/>
</DataTemplate>
</MenuItem.ItemTemplate>
</MenuItem>
</Menu>
或者,也许更简洁:
<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>
【讨论】:
感谢您的回答!我还有一个问题:使用 ItemContainerStyle,我如何将 MenuItem 的 IsChecked 属性绑定到多重绑定? 没问题。这可能应该是一个单独的问题,但我更新了我的答案以向您展示如何。 啊,现在我明白了。谢谢肯特! 很好的回应,我正在处理类似于原始问题的问题。鉴于您的回答,转换器是将 IsChecked 设置为仅对某些孩子说真的唯一方法,还是有另一种方法(例如触发器)?谢谢 !我已经为此发布了一个问题 (***.com/questions/4305439/…) YourConverter 将实际转换什么?以上是关于对 MenuItem 使用 DataTemplate 会导致左侧出现额外空间?的主要内容,如果未能解决你的问题,请参考以下文章
[WPF 自定义控件]在MenuItem上使用RadioButton
MenuItem.setIcon 在使用 BottomNavigationBar 时抛出 NullPointerException