我有一个使用xaml构建的菜单,而MenuItem将属性ItemTemplate设置为以下模板:
<HierarchicalDataTemplate x:Key="MenuItemTemplate" DataType="{x:Type mainMenu:MenuItem}" ItemsSource="{Binding ChildMenuItems}">
<MenuItem Command="{Binding Command}" CommandParameter="{Binding CommandParameter}" Header="{Binding Path=Header}" Visibility="{Binding Visible, Converter={converter:BooleanToVisibilityConverter}}" />
</HierarchicalDataTemplate>
当我将属性Visible的值更改为false以隐藏子菜单时,结果是:
子菜单被隐藏但仍占用一些空间。如何更改它以适应菜单中剩余的项目数?
修改
这里是转换器的代码:
public class BooleanToVisibilityConverter : MarkupExtension, IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (bool) value ? Visibility.Visible : Visibility.Collapsed;
}
}
答案 0 :(得分:1)
我怀疑你从转换器返回Visibility.Hidden
。而是返回Visibility.Collapsed
。
来自MSDN:
此外,WPF提供BooleanToVisibilityConverter
,除非做一些额外的事情,否则你不需要重新定义它。您可以在App资源部分下添加资源,并使用:
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
答案 1 :(得分:1)
您不应该使用HierarchicalDataTemplate
来定义您的孩子MenuItem
。相反,请尝试使用MenuItem.ItemsSource
属性:
<DataTemplate x:Key="MenuItemTemplate" DataType="{x:Type mainMenu:MenuItem}">
<MenuItem Command="{Binding Command}" CommandParameter="{Binding CommandParameter}"
Header="{Binding Path=Header}" Visibility="{Binding Visible, Converter={
converter:BooleanToVisibilityConverter}}"
ItemsSource="{Binding ChildMenuItems}" />
</DataTemplate>
更新&gt;&gt;&gt;
对不起,您需要将MenuItem
集中的子Style
属性设置为MenuItem.ItemContainerStyle
。我不想在这里解释所有内容,而是希望引导您访问MSDN上Lester的WPF \ SL博客的Binding menus using HeirarchicalDataTemplates页面,该页面解释了如何做好。
此外,如果您要对MenuItem
进行数据绑定,那么您也可以从数据绑定集合中删除相关项,而不是尝试设置Visibility
。用户界面看起来会一样,但会更简单。最好尽可能在WPF中操作数据元素,而不是UI元素。
答案 2 :(得分:0)
我没有使用绑定进行测试,但我在
之前使用了成功使用的绑定方式<Menu>
<Menu.Resources>
<Style TargetType="MenuItem">
<Setter Property="Visibility" Value="Collapsed" />
</Style>
</Menu.Resources>
<MenuItem Header="ONe" />
<MenuItem Header="Two" />
<MenuItem Header="Three" />
</Menu>