2016-02-08 106 views
3

所以這個問題已經被問過but not answerednot answered the way I would likeAvalondock MVVM佈局

我知道如何創建我想才達到的佈局,使用LayoutAnchorablePaneGroupLayoutAnchorablePane和XAML LayoutDocument,但我想在MVVM使用Avalondock這樣,減少了我的XAML到:

<avalonDock:DockingManager x:Name="dockingManager" 
             DataContext="{Binding DockManagerViewModel}" 
             DocumentsSource="{Binding Documents}" 
             AnchorablesSource="{Binding Anchorables}" 
             Loaded="dockingManager_Loaded" 
             Unloaded="dockingManager_Unloaded"> 

灌裝DocumentsAnchorables使所需的窗口出現在dockingManager,但我不知道怎樣才能secify,他們將出現的位置。

如何在不丟失MVVM分隔的情況下指定一些規則(預先在XAML中)來構建特定佈局? A型的

例如爲:對象應該都去togehter在LayoutAnchorablePane右側,B類型的對象都去一起在左邊一個等.. LayoutAnchorablePane提前

感謝。

+0

這是一個相當寬泛的問題和一些除了那些你報價,喜歡http://stackoverflow.com/a/32567244/2224701答案,或http:/ /www.codeproject.com/Articles/239342/AvalonDock-and-MVVM –

+0

是的,我見過這些。鏈接1對於學習一般的Avalondock MVVM方法非常有用,但它並沒有回答我的問題(或者我不明白答案),而我不確定鏈接2是否仍然相關。由於它沒有使用'DataContext','DocumentSource'或'AnchorablesSoruce',它可能是一個柺杖,使舊的Avalondock版本與MVVM兼容。我希望使用AvalonDock 2.0可能會更容易一些。 –

+0

因此,您是否已經遵循了CodePlex AvalonDock MVVM示例應用程序方法,並且遇到了Anchorables的一些特定問題? 「但我不明白我怎樣才能確定他們出現的地點」 - 「地點」究竟意味着什麼?你需要實現一些特定的初始佈局?考慮讓你的問題更具體。 –

回答

0

我去過同樣的情況。並找到了一個棘手但適合我的解決方案。

跟着Solution on Code Project實現保存並加載佈局。

請注意,第一次應用程序啓動時,它沒有佈局,因此您需要創建一個帶有所需佈局的XML,稍後可以加載保存的佈局。希望這可以幫助。

例對接經理:

<xcad:DockingManager x:Name="DockingManagerDockView" 
         AnchorablesSource="{Binding AnchorableSource}" 
         DocumentsSource="{Binding DocumentSource}" 
         Utility:AvalonDockLayoutSerializer.SaveLayoutCommand="{Binding SaveLayoutCommandOnExit}" 
         Utility:AvalonDockLayoutSerializer.LoadLayoutCommand="{Binding LoadLayoutCommand}">  
    <xcad:DockingManager.Theme> 
     <xcad:MetroTheme /> 
    </xcad:DockingManager.Theme> 
    <xcad:DockingManager.LayoutUpdateStrategy> 
     <Pane:LayoutInitializer/> 
    </xcad:DockingManager.LayoutUpdateStrategy> 
    <xcad:DockingManager.Resources>    
     <DataTemplate DataType="{x:Type ViewModels:ExplorerViewModel}"> 
      <Views:ExplorerView /> 
     </DataTemplate>    
     <DataTemplate DataType="{x:Type ViewModels:TableOfContentViewModel}"> 
      <Views:TableOfContentView x:Name="TOCView" Focusable="True"> 
       <Views:TableOfContentView.InputBindings> 
        <KeyBinding Key="F5" Command="{Binding GridF5Command}"/> 
       </Views:TableOfContentView.InputBindings> 
      </Views:TableOfContentView> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type ViewModels:PropertyViewModel}"> 
      <Views:PropertyView /> 
     </DataTemplate>   
     <DataTemplate DataType="{x:Type ViewModels:SearchViewModel}"> 
      <Views:SearchPanel /> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type ViewModels:DocumentViewModel}"> 
      <Views:DocumentView /> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type ViewModels:ReIndexPanelViewModel}"> 
      <Views:ReIndexPanel /> 
     </DataTemplate> 
    </xcad:DockingManager.Resources>  
    <xcad:DockingManager.LayoutItemContainerStyleSelector> 
     <Pane:PanesStyleSelector> 
      <Pane:PanesStyleSelector.ToolStyle> 
       <Style TargetType="{x:Type xcad:LayoutAnchorableItem}"> 
        <Setter Property="Title" Value="{Binding Model.Title}"/> 
        <Setter Property="Visibility" Value="{Binding Model.IsVisible, Mode=TwoWay, Converter={StaticResource BoolToVisibilityConverter}, ConverterParameter={x:Static Visibility.Hidden}}"/> 
        <Setter Property="ContentId" Value="{Binding Model.ContentId}"/> 
        <Setter Property="FlowDirection" Value="LeftToRight"/> 
        <Setter Property="UseLayoutRounding" Value="False"/> 
        <Setter Property="IconSource" Value="{Binding Model.IconSource}"/> 
       </Style> 
      </Pane:PanesStyleSelector.ToolStyle> 
      <Pane:PanesStyleSelector.FileStyle> 
       <Style TargetType="{x:Type xcad:LayoutItem}"> 
        <Setter Property="Title" Value="{Binding Model.Title}"/> 
        <Setter Property="ToolTip" Value="{Binding Model.FilePath}"/> 
        <Setter Property="ContentId" Value="{Binding Model.ContentId}"/> 
        <Setter Property="CanClose" Value="False"/>       
       </Style> 
      </Pane:PanesStyleSelector.FileStyle> 
     </Pane:PanesStyleSelector> 
    </xcad:DockingManager.LayoutItemContainerStyleSelector> 
    <xcad:LayoutRoot> 
     <xcad:LayoutPanel Orientation="Horizontal">     
       <xcad:LayoutAnchorablePaneGroup> 
        <xcad:LayoutAnchorablePane Name="Explorer" DockMinWidth="250"/> 
        <xcad:LayoutAnchorablePane Name="TOC" DockMinWidth="500"/> 
        <xcad:LayoutAnchorablePane Name="Property" DockMinWidth="300" /> 
        <xcad:LayoutAnchorablePane Name="Search" DockMinWidth="300" /> 
        <xcad:LayoutAnchorablePane Name="ReIndex" DockMinHeight="300" /> 
       </xcad:LayoutAnchorablePaneGroup> 
      <xcad:LayoutDocumentPaneGroup > 
       <xcad:LayoutDocumentPane/> 
      </xcad:LayoutDocumentPaneGroup> 
     </xcad:LayoutPanel>    
    </xcad:LayoutRoot> 
</xcad:DockingManager> 
+0

是的,我已經看到了這個,但是我對這個解決方案有一個問題:如果您添加一個新文檔,您如何指定它應該在哪個DocumentPane中創建? –

+0

對不起,想創建新行,輸入添加評論:) –

+0

好吧,很好,我已經添加了如何我的對接管理器是如何做到的答案。 –