caliburn.micro - 为 Caliburn 托管窗口启用始终位于顶部

标签 caliburn.micro

我有以下 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 参数通过包含属性名-值对的字典在创建的窗口上设置任何属性(例如 Topmost ):

windowManager.ShowWindow(new WizardViewModel(), 
    settings: new Dictionary<string,object> { {"Topmost", AlwaysOnTop} });

如果您想更改已创建窗口的 Topmost 属性,我会看到三个选项(按优先顺序排列):

  1. WizardViewModel 上创建一个 AlwaysOnTop 属性,并将 View 模型存储在私有(private)字段中,并将 AlwaysOnTop 委托(delegate)给 >WizardViewModel:

    private WizardViewModel wizardViewModel;
    
    public void FileDropped(DragEventArgs eventArgs)
    {
        //...
        wizardViewModel = new WizardViewModel()
        windowManager.ShowWindow(wizardViewModel);
    }
    
    public bool AlwaysOnTop
    {
         get { return Settings.Default.DropWindowAlwaysOnTop; }
         set
         {
             //...
             if (wizardViewModel != null)
                 wizardViewModel.AlwaysOnTop = value;
         }
    }
    

    在您的 View 中,您可以将 WizardViewModelAlwaysOnTop 属性绑定(bind)到窗口的 TopMost 属性。

  2. 您可以使用Application.Windows检索窗口。例如。使用设置字典设置创建的窗口的 Name 属性,然后:

    windowManager.ShowWindow(new WizardViewModel(), 
        settings: new Dictionary<string,object> 
            { {"Topmost", AlwaysOnTop}, {"Name", "WizardWindow"} });
    
    public bool AlwaysOnTop
    {
         get { return Settings.Default.DropWindowAlwaysOnTop; }
         set
         {
             //...
             var wizardViewModel = Application.Current.Windows.OfType<Window>()
                 .SingleOrDefault(w => w.Name == "WizardWindow");
             if (wizardViewModel != null)
                 wizardViewModel.AlwaysOnTop = value;
         }
    }
    
  3. 派生自 WindowManager 并将其注册到 Bootstrapper 中,然后您可以覆盖 CreateWindowEnsureWindow 等方法将创建的窗口存储在某处设置附加属性等。

关于caliburn.micro - 为 Caliburn 托管窗口启用始终位于顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11729492/

相关文章:

c# - .xaml.cs 和 ViewModels/ViewModel.cs 有什么区别?

c# - 如何让按钮的 Click 事件操作 MVVM 中的另一个控件

silverlight - (Caliburn Micro) 将 ActionMessage 方法名映射到 ViewModel 的子对象

windows-phone-7 - 如何: Data Persistence in Windows Phone

c# - 使用 Caliburn.Micro 在应用程序栏和 Conductor 之间进行交互的最佳方式

c# - 如何使用 WPF 按钮或超链接打开资源管理器窗口以浏览给定的 UNC 路径?

visual-studio - 在Visual Studio中重命名文件夹后如何解决 namespace 路径?

c# - 获取 Window ShowDialog 取消和关闭之间的区别

wpf - 为什么应该为 WPF、SL 和 WP7 使用 UI 模式框架?

c# - 使用Caliburn Micro Framework将文件拖放到WPF中