2012-07-30 47 views
2

我有以下ViewModel,我正在使用Caliburn Micro。 IWindowManager实例已正确解析并且所有代码均可正常工作。正如TODO评论所示,我需要获取对当前窗口的引用,以便切换AlwaysOnTop属性。我怎样才能做到这一点?为Caliburn托管窗口始终启用顶部

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()); 
     } 
    } 

} 

}

+0

我的问题不清楚,或者没有人知道设置属性的方法吗? – michaelkoss 2012-08-01 13:20:50

回答

3

可以使用ShowWindow方法的settings参数与含有PROPERTYNAME - 值对的字典创建的窗口上设置的任何特性(例如Topmost):

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

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

  1. 创建于WizardViewModelAlwaysOnTop属性和视图模型存储在私人领域,并委托AlwaysOnTopWizardViewModel

    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; 
        } 
    } 
    

    而且在你看来,你可以绑定WizardViewModelAlwaysOnTop财产到窗口的TopMost属性。

  2. 您可以使用Application.Windows来检索窗口。例如。从WindowManager

    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. 导出并在Bootstrapper注册,然后你可以重写CreateWindowEnsureWindow等方法来存储创建的窗口:设置所创建的窗口的Name属性与设置字典,某处设置了附加属性等。

+0

对于已经显示的窗口怎么样? – michaelkoss 2012-08-06 21:18:51

+0

@michaelkoss与当前的Caliburn API无法获得所创建窗口的参考,这并不那么简单,请参阅我的更新答案。 – nemesv 2012-08-07 06:11:18

+0

越来越近,但我需要在具有AlwaysOnTop属性的窗口上设置Topmost,而不是在我的示例代码中新创建的WizardViewModel - DropWindowViewModel。但我认为你的解决方案#3也可以,因为(我相信)Caliburn会使用我的IWindowManager打开应用程序的第一个窗口。 – michaelkoss 2012-08-08 15:28:38

相关问题