2012-01-16 70 views
1

我在WPF中有一个窗口,它是窗口的所有者,它是所有其他窗口的所有者。尽量减少WPF中的子窗口当子窗口的所有者窗口最小化时

主要所有者(sideWindow)仅为200点宽度放置在左侧,另一个窗口放置在主窗口的右侧。 sideWindow有作为右窗口的子窗口打开窗体的按钮。

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

我该如何做到这一点?

+0

我不清楚问题是什么。是否其他孩子的窗户被最小化了,你不想让他们成为,或者他们不是,而你呢? – ChrisF 2012-01-16 13:37:26

+0

我希望所有的窗口最小化时,我最小化mainWindow – 2012-01-16 13:38:22

回答

1

我必须做一点点猜测这里,我真的不知道你的程序的体系结构。我将假设您有两个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} ...> 

注意如何将模式设置为双向。这可以确保当使用单击最小化窗口时更改状态时,它也会更改虚拟机中的值。就这样。

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

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

希望这有助于。

2

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

GalaSoft MVVM Light

2

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

+0

这是最好的答案 – AnjumSKhan 2017-02-06 05:21:43