覆盖2个控件并切换使用WPF可见的控件

时间:2011-07-14 13:06:13

标签: wpf layout

这是一个适用于任何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后面。)

我想我可以同时切换停靠面板的可见性(与按钮相反),但我希望避免这种情况。

3 个答案:

答案 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值。