我在WPF中有一个窗口,它是一个窗口的所有者,它是所有其他Windows的所有者。
主要所有者(sideWindow
)在宽度中只有200个点位于左侧,而另一个窗口位于主窗口的右侧。 sideWindow
有一个按钮,可以打开窗体作为右窗口的子窗口。
当我最小化mainWindow(sideWindow
)时,只有最右边的窗口被最小化,而其余子窗口没有最小化。
我怎样才能做到这一点?
答案 0 :(得分:2)
您应该使用Messaging解决方案来实现您的需求。 GalaSofts MVVM light有一个内置的Messenger。如果你最小化你的Window我想你用命令做,然后在ViewModel中你可以发送一条消息,其他人订阅这条消息并最小化Windows。我猜其他Messenger解决方案也只是尝试Google吧。
答案 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并在那里记下您的逻辑。无论如何,上面的示例代码中描述了最干净的解决方案。
希望这会有所帮助。