2

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

}

}

4

1 に答える 1

3

settingsメソッドのパラメーターを使用して、プロパティ名と値のペアを含むディクショナリを使用して、作成されたウィンドウにShowWindow任意のプロパティ (たとえばTopmost ) を設定できます。

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

既に作成されたウィンドウのプロパティを変更したい場合はTopmost、3 つのオプションが表示されます (優先順で)。

  1. AlwaysOnTopでプロパティを作成しWizardViewModel、viewmodel をプライベート フィールドに格納して、 を にデリゲートAlwaysOnTopします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;
         }
    }
    

    WizardViewModelビューでは、のAlwaysOnTopプロパティをウィンドウのプロパティにバインドできTopMostます。

  2. Application.Windowsを使用してウィンドウを取得できます。たとえばName、作成された Window のプロパティを設定ディクショナリで設定してから、次のようにします。

    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

于 2012-08-05T17:18:38.053 に答える