2012-07-30 3 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

답변

3

당신은 propertyName 형식 - 값 쌍을 포함하는 사전에 생성 된 윈도우에있는 속성 (예 Topmost)를 설정 ShowWindow 방법의 settings 매개 변수를 사용할 수

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

이미 생성 된 창의 Topmost 속성을 변경하려면 세 가지 옵션 (기본 설정 순서대로)이 표시됩니다.

  1. WizardViewModelAlwaysOnTop 속성을 만들고 민간 분야에서의 ViewModel을 저장하고 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을 사용하여 창을 검색 할 수 있습니다. 예 : 설정을 사전에 생성 된 윈도우의 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에 등록 다음은 생성 된 윈도우를 저장하는 CreateWindow, EnsureWindow 등의 방법을 대체 할 수 있습니다 어딘가에 추가 속성 등을 설정하십시오.

+0

이미 표시된 창은 어떨까요? – michaelkoss

+0

@michaelkoss 현재 Caliburn API를 사용하면 생성 된 창의 참조를 가져올 수 없습니다. 간단하지는 않습니다. 업데이트 된 답변을 참조하십시오. – nemesv

+0

점점 더 가까워지고 있지만 새로 만든 WizardViewModel이 아니라 AlwaysOnTop 속성이있는 창에서 Topmost를 설정해야합니다. 예제 코드의 DropWindowViewModel입니다. 하지만 Caliburn이 IWindowManager를 사용하여 응용 프로그램의 첫 번째 창을 열어 주므로 솔루션 # 3이 제대로 작동 할 것입니다. – michaelkoss