这是一个适用于任何WPF控件的一般性问题。
我要做的是将两个控件放在彼此的顶部并切换可见的。
即我想控制它们的可见性,以便一次只能看到一个控件。 一个控件通常会被隐藏,但有些事件会显示在另一个控件的顶部。
我尝试更改z顺序并尝试使用visibility属性,但是当我可以显示正常隐藏的控件时,通常显示的控件也可见。
E.g。下面的按钮通常是隐藏的,但是在菜单项单击时,例如,将设置viewmodel中的ShowAboutBox属性,从而更改visibility属性。此时按钮应该是可见的而不是dockpanel。
<Grid>
<Button Visibility="{Binding ShowAboutBox, Converter={StaticResource BoolToVisConverter}}">
<Button.Content>About My App</Button.Content></Button>
<DockPanel Canvas.ZIndex="0" LastChildFill="True"></DockPanel>
</Grid>
我对WPF没有经验,但假设这应该很容易 - 有什么建议吗?
编辑:
上面的代码展示了我尝试过的各种技术。并且可能会混淆问题。最近我尝试了以下无效。
<Grid>
<Button Visibility="{Binding ShowAboutBox, Converter={StaticResource BoolToVisConverter}}">
<Button.Content>About My App</Button.Content></Button>
<DockPanel></DockPanel>
</Grid>
更改按钮的可见性会使其显示,但停靠面板及其内容仍然位于按钮顶部。 (由于z顺序,该按钮显示在dockpanel后面。)
我想我可以同时切换停靠面板的可见性(与按钮相反),但我希望避免这种情况。
答案 0 :(得分:3)
我也会将DockPanel的Visibility绑定到ShowAboutBox,但是使用逆转换器。我有一堆方便的小转换器,就像这种情况一样:
<Grid>
<Button Visibility="{Binding ShowAboutBox, Converter={StaticResource BoolToVisConverter}}">About My App</Button>
<DockPanel Visibility="{Binding ShowAboutBox, Converter={StaticResource BoolToInverseVisConverter}}"></DockPanel>
</Grid>
基本转换器(可以扩展为支持nullables等):
public class BooleanToInverseVisibilityConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
return (bool) value ? Visibility.Collapsed : Visibility.Visible;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
return null;
}
}
答案 1 :(得分:0)
您的ZIndex技巧无效,因为该按钮的zindex也为0(因为它是集合中的第一个)。您需要明确地将按钮的ZIndex更改为高于0的值,以使DockPanel显示在其上方。
那就是说,这里正确的解决方案就是在隐藏和放大之间切换按钮的Visibility属性。可见,根本没有改变ZIndex。
答案 2 :(得分:0)
您可以使用通用的BooleanConverter here并相应地声明True和False值。