我有以下 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
属性,我会看到三个选项(按优先顺序排列):
在
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 中,您可以将
WizardViewModel
的AlwaysOnTop
属性绑定(bind)到窗口的TopMost
属性。您可以使用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; } }
派生自
WindowManager
并将其注册到Bootstrapper
中,然后您可以覆盖CreateWindow
、EnsureWindow
等方法将创建的窗口存储在某处设置附加属性等。
关于caliburn.micro - 为 Caliburn 托管窗口启用始终位于顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11729492/