MVVM方法使窗口出现在前面

本文关键字:在前面 窗口 方法 MVVM | 更新日期: 2023-09-27 18:17:21

我有一个wpf应用程序,需要根据某些条件在所有其他窗口前面弹出。我正试图以MVVM兼容的方式实现这一点。经过大量的研究,最好的解决方案是使用窗口的激活事件和界面的行为。我能够使用在mvvm activate上找到的第二个解决方案使激活函数工作。然而,一旦我使用基于快速入门指南的Mahapp Metro控件"MetroWindow"来设计我的GUI, GUI就乱了。每当添加XAML交互行为部分时,GUI的原始窗口对象就会出现,并产生两个标题栏(一个来自Window,另一个来自MetroWindow)。我试着用Metro样式设计我自己的窗口,但到目前为止还无法实现Metro标题栏(找不到任何关于这样做的指南或文档)。Visual studio也一直抱怨"对象引用没有设置为对象的实例"(有时在

上)。
<controls:MetroWindow
...

上的其他时间
<i:Interaction.Behaviors>
    <Behaviors:ActivateBehavior ...

程序还在运行

我如何保持Mahapps Metro样式(包括标题栏样式),并使窗口出现在前面,由我的业务逻辑在MVVM兼容的方式确定?

MVVM方法使窗口出现在前面

这不是问题本质的答案,但也许您可以使用像这样的东西来激活窗口:

using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;    
using GalaSoft.MvvmLight.Messaging;
// View
public partial class TestActivateWindow : Window
{
    public TestActivateWindow() {
        InitializeComponent();
        Messenger.Default.Register<ActivateWindowMsg>(this, (msg) => Activate());
    }
}
// View Model
public class ActivateWindowMsg
{
}
public class MainViewModel: ViewModelBase
{
    ICommand _activateChildWindowCommand;
    public ICommand ActivateChildWindowCommand {
        get {
            return _activateChildWindowCommand?? (_activateChildWindowCommand = new RelayCommand(() => {
                Messenger.Default.Send(new ActivateWindowMsg());
        }));
        }
    }
}