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

时间:2012-01-16 13:32:03

标签: c# .net wpf mvvm

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

主要所有者(sideWindow)在宽度中只有200个点位于左侧,而另一个窗口位于主窗口的右侧。 sideWindow有一个按钮,可以打开窗体作为右窗口的子窗口。

当我最小化mainWindow(sideWindow)时,只有最右边的窗口被最小化,而其余子窗口没有最小化。

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:2)

您应该使用Messaging解决方案来实现您的需求。 GalaSofts MVVM light有一个内置的Messenger。如果你最小化你的Window我想你用命令做,然后在ViewModel中你可以发送一条消息,其他人订阅这条消息并最小化Windows。我猜其他Messenger解决方案也只是尝试Google吧。

GalaSoft MVVM Light

答案 1 :(得分:2)

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

答案 2 :(得分:1)

我必须在这里做一点猜测,因为我真的不知道你的程序的架构。我将假设您有两个Windows类: MainWindow SideWindow ,以及单个视图模型类 AppVm 。如果您有不同的设置,则必须进行调整。

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

View Model类:

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绑定到视图模型上的WindowState:

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

请注意我如何将模式设置为TwoWay。这确保了当使用单击最小化窗口时更改状态时,它还将更改VM中的值。就是这样。

现在,如果您的架构不同,您将不得不适应。当用户最大化其中一个窗口(你甚至允许它)时,你不清楚你想做什么。如果每个Window有两个不同的视图模型类,则可以写下更复杂的路径,假设一个视图具有对另一个视图的引用,仅将stae变量保存在内部类中,则绑定语句可以是:Path = OtherVm.state。

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

希望这会有所帮助。