Caliburn.micro 为Caliburn托管窗口启用始终在顶部

Caliburn.micro 为Caliburn托管窗口启用始终在顶部,caliburn.micro,Caliburn.micro,我有下面的ViewModel,我使用的是Caliburn Micro。IWindowManager实例已正确解析,所有代码都正常工作。如TODO注释所示,我需要获取对当前窗口的引用,以便切换AlwaysOnTop属性。我该怎么做 namespace CaliburnWizardPlay { [Export(typeof(DropWindowViewModel))] public class DropWindowViewModel : PropertyChangedBase, IHaveDispl

我有下面的ViewModel,我使用的是Caliburn Micro。IWindowManager实例已正确解析,所有代码都正常工作。如TODO注释所示,我需要获取对当前窗口的引用,以便切换AlwaysOnTop属性。我该怎么做

namespace CaliburnWizardPlay
{
[Export(typeof(DropWindowViewModel))]
public class DropWindowViewModel : PropertyChangedBase, IHaveDisplayName
{
    private readonly IWindowManager windowManager;

    [ImportingConstructor]
    public DropWindowViewModel(IWindowManager windowManager)
    {
        this.windowManager = windowManager;
    }

    public string DisplayName
    {
        get { return "Main Window"; }
        set { }
    }        

    public bool AlwaysOnTop
    {
        get { return Settings.Default.DropWindowAlwaysOnTop; }
        set
        {
            Settings.Default.DropWindowAlwaysOnTop = value;
            Settings.Default.Save();
            NotifyOfPropertyChange(() => AlwaysOnTop);
            //todo: toggle the AOT attribute of the window
        }
    }

    public void FileDropped(DragEventArgs eventArgs)
    {
        if (eventArgs.Data.GetDataPresent(DataFormats.FileDrop))
        {
            string[] droppedFilePaths = eventArgs.Data.GetData(DataFormats.FileDrop, true) as string[];
            foreach (string path in droppedFilePaths)
            {
                MessageBox.Show(path);
            }

            windowManager.ShowWindow(new WizardViewModel());
        }
    }

}

}

您可以使用
ShowWindow
方法的
settings
参数,使用包含propertyname值对的字典在创建的窗口上设置任何属性(例如):

windowManager.ShowWindow(新向导ViewModel(),
设置:新字典{{“最顶层”,AlwaysOnTop});
如果要更改已创建窗口的
最顶部的
属性,我将看到三个选项(按首选项的顺序):

  • WizardViewModel
    上创建
    AlwaysOnTop
    属性,将viewmodel存储在专用字段中,并将
    AlwaysOnTop
    委托给
    WizardViewModel

    私有向导视图模型向导视图模型;
    已删除公共无效文件(DragEventArgs eventArgs)
    {
    //...
    wizardViewModel=新wizardViewModel()
    windowManager.ShowWindow(wizardViewModel);
    }
    公共场所
    {
    获取{return Settings.Default.DropWindowAlwaysOnTop;}
    设置
    {
    //...
    if(wizardViewModel!=null)
    wizardViewModel.AlwaysOnTop=值;
    }
    }
    
    在您的视图中,您可以将
    WizardViewModel
    AlwaysOnTop
    属性绑定到窗口的
    Top
    属性

  • 您可以使用检索窗口。例如,使用设置词典设置所创建窗口的
    名称
    属性,然后:

    windowManager.ShowWindow(新向导ViewModel(),
    设置:新字典
    {{“最上面的”,总是最上面的,{“名字”,“向导窗口”});
    公共场所
    {
    获取{return Settings.Default.DropWindowAlwaysOnTop;}
    设置
    {
    //...
    var-wizardViewModel=Application.Current.Windows.OfType()
    .SingleOrDefault(w=>w.Name==“向导窗口”);
    if(wizardViewModel!=null)
    wizardViewModel.AlwaysOnTop=值;
    }
    }
    
  • WindowManager
    派生并在
    Bootstrapper
    中注册它,然后您可以覆盖
    CreateWindow
    EnsureWindow
    等方法,将创建的窗口存储在某处,并设置其他属性等


  • 我的问题不清楚,或者没有人知道设置属性的方法吗?@michaelkoss使用当前的Caliburn API,您无法获取所创建窗口的引用。没有那么简单,请参阅我的更新答案。越来越近,但我需要设置具有AlwaysOnTop属性的窗口的最顶端,不是新创建的WizardViewModel——我的示例代码中的DropWindowViewModel。但我认为你的解决方案#3也会奏效,因为(我相信)Caliburn会使用我的iWindows管理器打开应用程序的第一个窗口。