当子的所有者窗口的所有者窗口最小化时,最小化 WPF 中的子窗口



我在WPF中有一个窗口,它是一个窗口的所有者,它是所有其他窗口的所有者。

主所有者(sideWindow)的宽度仅为200点,位于主窗口的左侧,另一个窗口位于主窗口右侧。sideWindow有一个按钮,它将窗体作为右侧窗口的子窗口打开。

当我最小化主窗口(sideWindow)时,只有右侧窗口最小化,其余子窗口不最小化。

我怎样才能做到这一点?

最简单的方法是将每个子窗口的Owner属性设置为指向主窗口。你在这么做吗?

我必须在这里做一些猜测,因为我真的不知道你的程序的体系结构。我假设您有两个Windows类:MainWindowSideWindow,以及一个单视图模型类AppVm。如果你有不同的设置,你就必须适应。

最简单的解决方案是将两个窗口的WindowState绑定到ViewModel中的单个属性。确保属性触发通知。

视图模型类:

class AppVm : INotifyPropertyChanged {
    public event PropertyChangedEventHandler PropertyChanged;
    private WindowState m_state;
    public WindowState state {
        get { return m_state; }
        set { m_state=value; raise("state") }
    }
    private raise(string propname) {
        PropertyChanged(this, new PropertyChangedEventArgs(propname));
    }
    ....
}

现在,在Windows XAML文件中,将WindowState绑定到视图模型上的那个:

<Window ... WindowState="{Binding Path=state,Mode=TwoWay} ...>

注意我是如何将模式设置为双向的。这确保了当使用单击最小化窗口时状态发生更改时,它也会更改VM中的值。仅此而已。

现在,如果你的体系结构不同,你就必须适应。当用户最大化其中一个窗口时,你想做什么还不清楚(你甚至允许吗)。如果每个Window有两个不同的视图模型类,可以写下一个更复杂的路径,假设一个视图引用了另一个视图,只在内部类中保存stae变量,那么绑定语句可以是:path=OtherVm.state。

如果您的视图逻辑更复杂,可以在视图中隐藏一些代码(*.xaml.cs文件)。唯一的规则是视图模型不应该"知道"视图(理论上,虚拟机也可以运行"单元测试视图")。您可以订阅视图的事件StateChanged,并在那里写下您的逻辑。无论如何,上面的示例代码中描述了最干净的解决方案。

希望这能有所帮助。

您应该使用消息传递解决方案来实现您想要的内容。GalaSofts的MVVM灯有一个内置的信使。如果你最小化你的窗口,我想你可以用一个命令来完成,然后在ViewModel中你可以发送一条消息,其他人可以订阅这个消息并最小化窗口。我想还有其他信使的解决方案也只是尝试谷歌它。

GalaSoft MVVM Light

最新更新