我在UserControl中有一个边框控件,它用作图形更改的开关。边框有一个带有两个MenuItems的上下文菜单:“打开”和“关闭”。
当开关关闭时,只有“打开”MenuItem可见,而当开关打开时,只有“关闭”可见。对于某些开关,我需要完全禁用Open或Close,所以我不希望它们在任何时候都可见。代码如下:
<Border.ContextMenu>
<ContextMenu Name="switchContextMenu">
<ContextMenu.Visibility>
<MultiBinding Converter="{StaticResource ContextMenuBoolToVisibility}">
<Binding Path="OpenAvailable" />
<Binding Path="OpenVisible" />
<Binding Path="CloseAvailable" />
<Binding Path="CloseVisible" />
</MultiBinding>
</ContextMenu.Visibility>
<MenuItem Name="miOpen" Header="{Binding Path=Resources.PowerControlSystem_OPEN, Source={StaticResource LocalizedStrings} }"
Click="miOpen_Click">
<MenuItem.Visibility>
<MultiBinding Converter="{StaticResource BooleanToVisibilityMultiValueAND}">
<Binding Path="OpenAvailable" />
<Binding Path="OpenVisible" />
</MultiBinding>
</MenuItem.Visibility>
</MenuItem>
<MenuItem Name="miClose" Header="{Binding Path=Resources.PowerControlSystem_CLOSE, Source={StaticResource LocalizedStrings} }"
Click="miClose_Click">
<MenuItem.Visibility>
<MultiBinding Converter="{StaticResource BooleanToVisibilityMultiValueAND}">
<Binding Path="CloseAvailable" />
<Binding Path="CloseVisible" />
</MultiBinding>
</MenuItem.Visibility>
</MenuItem>
</ContextMenu>
</Border.ContextMenu>我将此开关用作通用组件,因此在另一个.xaml代码中设置了"Open Available“和"Close Available”属性。这就是我的问题:
我有一个开关,它的Open Available属性设置为False。默认情况下,此开关处于打开状态。我可以把它关了,这没问题。然后,当我再次右键单击此开关时,上下文菜单不可见。这也没问题。
问题是,当我更改某些值时,此开关再次打开,并且在该时间点上,弹出上下文菜单。我认为问题出在ContextMenu可见性的转换器中。它在此时被触发,并且ContextMenu变得可见。
有没有人知道如何阻止这种行为?
发布于 2017-01-11 23:07:56
您可以设置Border的样式,而不是设置ContextMenu可见性
<Border>
<Border.Style>
<Style TargetType="Border">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu Name="switchContextMenu">
<MenuItem Name="miOpen" Header="{Binding Path=Resources.PowerControlSystem_OPEN, Source={StaticResource LocalizedStrings} }"
Click="miOpen_Click">
<MenuItem.Visibility>
<MultiBinding Converter="{StaticResource BooleanToVisibilityMultiValueAND}">
<Binding Path="OpenAvailable" />
<Binding Path="OpenVisible" />
</MultiBinding>
</MenuItem.Visibility>
</MenuItem>
<MenuItem Name="miClose" Header="{Binding Path=Resources.PowerControlSystem_CLOSE, Source={StaticResource LocalizedStrings} }"
Click="miClose_Click">
<MenuItem.Visibility>
<MultiBinding Converter="{StaticResource BooleanToVisibilityMultiValueAND}">
<Binding Path="CloseAvailable" />
<Binding Path="CloseVisible" />
</MultiBinding>
</MenuItem.Visibility>
</MenuItem>
</ContextMenu>
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Value="False">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource ContextMenuBoolAggregate}">
<Binding Path="OpenAvailable" />
<Binding Path="OpenVisible" />
<Binding Path="CloseAvailable" />
<Binding Path="CloseVisible" />
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="ContextMenu" Value="{x:Null}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
</Border>因此,触发器会有条件地删除ContextMenu,而不是更改其可见性。我使用ContextMenuBoolAggregate转换器名称来表示您需要创建一个新的转换器来确定正确的值,以删除上下文菜单-我认为如何实现该部分很清楚。
如果您的条件足够简单,则可以在MultiBinding和Converter中使用MultiDataTrigger而不是DataTrigger
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding OpenAvailable}" Value="False"/>
<Condition Binding="{Binding OpenVisible}" Value="False"/>
<Condition Binding="{Binding CloseAvailable}" Value="False"/>
<Condition Binding="{Binding CloseVisible}" Value="False"/>
</MultiDataTrigger.Conditions>
<Setter Property="ContextMenu" Value="{x:Null}"/>
</MultiDataTrigger>发布于 2017-01-12 16:08:53
我用另一种方式找到了解决方案。我使用了ContextMenuService.IsEnabled属性。当设置为false时,无法显示上下文菜单。因此,我在我的Border.xaml代码中添加了以下内容:
<ContextMenuService.IsEnabled>
<MultiBinding Converter="{StaticResource ContextMenuBoolToVisibility}">
<Binding Path="OpenAvailable" ElementName="mySwitch" />
<Binding Path="OpenVisible" ElementName="mySwitch" />
<Binding Path="CloseAvailable" ElementName="mySwitch" />
<Binding Path="CloseVisible" ElementName="mySwitch" />
</MultiBinding>
</ContextMenuService.IsEnabled>我还更改了我的ContextMenuBoolToVisibility转换器。现在为ContextMenuService.IsEnabled属性返回true或false,而不是返回Visibility.Visible或Visibility.Collapsed。
https://stackoverflow.com/questions/41594048
复制相似问题