WPF AvalonDock拖拽佈局學習整理

AvalonDock提供了一個系統,允許開發人員使用類似於許多流行的集成開發環境(IDE)中的窗口對接系統來創建可自定義的佈局。

AvalonDock遵循MVVM設計。ModelXceed.Wpf.AvalonDock.Layout命名空間中包含的類表示。此命名空間中的類是佈局模型中的佈局元素(例如LayoutAnchorable / LayoutDocumentLayoutAnchorablePane / LayoutDocumentPaneLayoutAnchorablePaneGroup / LayoutDocumentPaneGroup等),它們直接在DockingManager中的XAML中使用,以描述佈局的組成方式。

https://github.com/xceedsoftware/wpftoolkit/wiki/AvalonDock_avalondock.jpg

以下示例顯示如何在DockingManager中設置各種佈局元素。

<local:DemoView x:Class="LiveExplorer.Samples.AvalonDock.Views.AvalonDockView"

                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

                 xmlns:local="clr-namespace:LiveExplorer"

                 xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"

                 xmlns:xcad="http://schemas.xceed.com/wpf/xaml/avalondock"

                 xmlns:s="clr-namespace:System;assembly=mscorlib">

   <Grid>

      <Grid.RowDefinitions>

         <RowDefinition Height="Auto" />

         <RowDefinition Height="*" />

      </Grid.RowDefinitions>

 

      <StackPanel Orientation="Horizontal" Margin="0,0,0,10">

         <TextBlock Text="Theme:" Margin="0,0,10,0" VerticalAlignment="Center"/>

         <ComboBox x:Name="_themeCombo" SelectedIndex="0" Width="200">

            <ComboBoxItem Content="Generic" />

            <ComboBoxItem Content="Aero">

               <ComboBoxItem.Tag>

                  <xcad:AeroTheme />

               </ComboBoxItem.Tag>

            </ComboBoxItem>

            <ComboBoxItem Content="VS2010">

               <ComboBoxItem.Tag>

                  <xcad:VS2010Theme />

               </ComboBoxItem.Tag>

            </ComboBoxItem>

            <ComboBoxItem Content="Metro">

               <ComboBoxItem.Tag>

                  <xcad:MetroTheme />

               </ComboBoxItem.Tag>

            </ComboBoxItem>

         </ComboBox>

      </StackPanel>

 

      <xcad:DockingManager Grid.Row="1" MaxHeight="425"

                           AllowMixedOrientation="True"

                           BorderBrush="Black"

                           BorderThickness="1"

                           Theme="{Binding ElementName=_themeCombo, Path=SelectedItem.Tag}">

         <xcad:DockingManager.DocumentHeaderTemplate>

            <DataTemplate>

               <StackPanel Orientation="Horizontal">

                  <Image Source="{Binding IconSource}" Margin="0,0,4,0"/>

                  <TextBlock Text="{Binding Title}" />

               </StackPanel>

            </DataTemplate>

         </xcad:DockingManager.DocumentHeaderTemplate>

         <xcad:LayoutRoot x:Name="_layoutRoot">

            <xcad:LayoutPanel Orientation="Horizontal">

               <xcad:LayoutAnchorablePane DockWidth="200">

                  <xcad:LayoutAnchorable ContentId="properties" Title="Properties" CanHide="False" CanClose="False"

                                            AutoHideWidth="240"

                                         IconSource="../Images/property-blue.png">

                     <xctk:PropertyGrid NameColumnWidth="110"

                        SelectedObject="{Binding ElementName=_layoutRoot, Path=LastFocusedDocument.Content}"/>

                  </xcad:LayoutAnchorable>

               </xcad:LayoutAnchorablePane>

               <xcad:LayoutDocumentPaneGroup >

                  <xcad:LayoutDocumentPane>

                     <xcad:LayoutDocument ContentId="document1" Title="Document 1" IconSource="../Images/document.png" >

                           <Button Content="Document 1 Content" HorizontalAlignment="Center" VerticalAlignment="Center"/>

                     </xcad:LayoutDocument>

                     <xcad:LayoutDocument ContentId="document2" Title="Document 2" IconSource="../Images/document.png">

                        <TextBox Text="Document 2 Content" AcceptsReturn="True"/>

                     </xcad:LayoutDocument>

                  </xcad:LayoutDocumentPane>

               </xcad:LayoutDocumentPaneGroup >

               <xcad:LayoutAnchorablePaneGroup DockWidth="125">

                  <xcad:LayoutAnchorablePane>

                     <xcad:LayoutAnchorable ContentId="alarms" Title="Alarms" IconSource="../Images/alarm-clock-blue.png" >

                        <ListBox>

                           <s:String>Alarm 1</s:String>

                           <s:String>Alarm 2</s:String>

                           <s:String>Alarm 3</s:String>

                        </ListBox>

                     </xcad:LayoutAnchorable>

                     <xcad:LayoutAnchorable ContentId="journal" Title="Journal" >

                        <RichTextBox>

                           <FlowDocument>

                              <Paragraph FontSize="14" FontFamily="Segoe">

                                 This is the content of the Journal Pane.

                                 <LineBreak/>

                                 A

                                 <Bold>RichTextBox</Bold> has been added here

                              </Paragraph>

                           </FlowDocument>

                        </RichTextBox>

                     </xcad:LayoutAnchorable>

                  </xcad:LayoutAnchorablePane>

               </xcad:LayoutAnchorablePaneGroup>

            </xcad:LayoutPanel>

 

            <xcad:LayoutRoot.LeftSide>

               <xcad:LayoutAnchorSide>

                  <xcad:LayoutAnchorGroup>

                     <xcad:LayoutAnchorable Title="Agenda" ContentId="agenda" IconSource="../Images/address-book-open.png">

                        <TextBlock Text="Agenda Content" Margin="10" FontSize="18" FontWeight="Black" TextWrapping="Wrap"/>

                     </xcad:LayoutAnchorable>

                     <xcad:LayoutAnchorable Title="Contacts" ContentId="contacts" IconSource="../Images/address-book--pencil.png" >

                        <TextBlock Text="Contacts Content" Margin="10" FontSize="18" FontWeight="Black" TextWrapping="Wrap"/>

                     </xcad:LayoutAnchorable>

                  </xcad:LayoutAnchorGroup>

               </xcad:LayoutAnchorSide>

            </xcad:LayoutRoot.LeftSide>

         </xcad:LayoutRoot>

      </xcad:DockingManager>

   </Grid>

</local:DemoView>

該視圖由Xceed.Wpf.AvalonDock.Controls命名空間中包含的類表示這些類是一組可顯示用戶控件的可調節控件。視圖控件的名稱通常以“Control”結尾,並對應於佈局模型類(例如,LayoutAnchorableControl是與LayoutAnchorable對應的視圖控件,它是模型元素)。

DockingManager包含在Xceed.Wpf.AvalonDock命名空間中,它使用各種類(例如LayoutItem及其派生類)來執行ViewModel的角色,準備視圖使用的模型。

只有一個邏輯樹,以DockingManager爲根。即使控件放在不同的窗口(即自動隱藏窗口或浮動窗口)中,它也始終屬於DockingManager下面的同一邏輯樹。

DockingManager

DockingManager類是AvalonDock的核心控制。其Layout屬性包含由Xceed.Wpf.AvalonDock.Layout命名空間中的類表示的佈局組合。該類安排它包含的窗格,並處理自動隱藏窗口和浮動窗口(窗格又直接或間接包含兩種類型的內容元素,即LayoutAnchorableLayoutDocument元素)。DockingManager類還處理保存和恢復佈局。

在其他屬性中,該類提供了幾個模板屬性(例如,AnchorableTitleTemplate / DocumentTitleTemplateAnchorableHeaderTemplate / DocumentHeaderTemplate等),允許設計人員和開發人員爲佈局中包含的元素指定模板。

佈局模型類

佈局元素類在DockingManagerLayout屬性中保存的佈局模型中使用。AvalonDock中包含基本內容的類是LayoutAnchorableLayoutDocument ; 這兩個類都派生自LayoutContent類,它確定元素是否可以關閉,浮動(被拖動並轉換爲浮動窗口)等。

可錨定通常是應用程序控件的容器,可以從其容器窗格(LayoutAnchorablePane)拖出並重新定位到另一個窗格中。Anchobles總是包含在窗格中,可以是LayoutAnchorablePaneLayoutDocumentPane而文檔(類LayoutDocument)只能包含在LayoutDocumentPane中。Anchobles也可以拖動到父DockingManager的邊框,這使它們出現在所有其他anchorables或文檔的上方,下方,左側或右側(自動隱藏窗口除外;請參閱下面的LayoutAnchorSide / LayoutAnchorGroup部分)詳情)。Anchorables也可以保持浮動狀態(LayoutAnchorableFloatingWindow)。與文檔不同,anchorables可以自動隱藏,其內容會摺疊到停靠管理器的一側,並且僅由選項卡表示(請參閱LayoutAnchorSideLayoutAnchorGroup)。

文檔(LayoutDocument類)只能在LayoutDocumentPane中託管。這與LayoutAnchorable的行爲形成對比,LayoutAnchorable可以在LayoutDocumentPaneLayoutAnchorablePane中託管。此外,與anchorables不同,文檔無法錨定到DockingManager邊框,也無法自動隱藏:它們只能放置在LayoutDocumentPane中或浮動在LayoutDocumentFloatingWindow中。

LayoutAnchorableFloatingWindowLayoutDocumentFloatingWindow當最終用戶通過拖動DockingManager一個錨固被自動創建。也可以使用Float方法以編程方式創建浮動窗口。

LayoutContent派生元素(LayoutAnchorableLayoutDocument)通常按Tab鍵控件排列。LayoutAnchorablePane可以設置爲自動隱藏,可以作爲浮動窗口拖過DockingManagerLayoutAnchorablePane也可以錨定到父DockingManager的邊框(有關詳細信息,請參閱LayoutAnchorSide)。

LayoutAnchorablePane不同,LayoutDocumentPane不能設置爲自動隱藏或作爲浮動窗口拖動DockingManager(儘管可以浮動單個LayoutDocument元素)。LayoutDocumentPane也無法錨定到父DockingManager的邊框。

LayoutPanel也可以包含窗格基元件(即,LayoutAnchorablePaneGroupLayoutDocumentPaneGroup),哪個組子窗格在一起並允許確定各種特徵,例如停靠組佔據的初始寬度/高度,從它們拖動的內容創建的浮動窗口的初始寬度/高度,以及窗格中的窗格的方向。組(與LayoutPanel的方向無關)。LayoutAnchorablePaneGroup表示佈局模型中的一個元素,它可以包含和排列多個LayoutAnchorablePane元素,而這些元素又包含LayoutAnchorable元素。LayoutDocumentPaneGroup表示佈局模型中的一個元素,它可以包含和組織多個LayoutDocumentPane元素,這些元素又包含LayoutDocument元素。窗格組類主要用於確定它們包含的窗格的方向。

LayoutRoot表示佈局模型的根。DockingManagerLayout屬性設置爲此類的實例。

LayoutRoot類的RootPanel屬性設置爲LayoutPanel類的實例。

LayoutPanel可以直接包含子窗格(即LayoutAnchorablePaneLayoutDocumentPane)。窗格又包含實際內容(即LayoutAnchorableLayoutDocument元素,兩者都派生自LayoutContent)。LayoutPanel還可以包含窗格組實例(即LayoutAnchorablePaneGroupLayoutDocumentPaneGroup),它將子窗格組合在一起並允許確定各種特徵,例如停靠組佔用的初始寬度/高度,浮動的初始寬度/高度從根據它們拖動的內容創建的窗口,以及組中窗格的方向(與LayoutPanel的方向無關)。

LayoutRoot類提供四個“Side”屬性(例如,LeftSide),它們與LayoutAnchorSideLayoutAnchorGroup類一起使用,以沿着包含DockingManager的邊框設置自動隱藏LayoutAnchorable元素。這些元素最初摺疊到它們所錨定的一側,僅顯示一個選項卡,“pin”字形指向左側。如果單擊自動隱藏可固定的圖釘字符使得銷釘朝下,則可錨定不再保持可見。只能自動隱藏LayoutAnchorable元素。

LayoutAnchorGroup表示一個或多個LayoutAnchorable元素的自動隱藏組,可以將其錨定到DockingManager的四個邊之一。要使用LayoutAnchorGroup,請向其添加LayoutAnchorable元素,並將生成的LayoutAnchorGroup添加到LayoutAnchorSide的實例。然後將生成的LayoutAnchorSide分配給DockingManagerLayout屬性中保存的LayoutRoot對象的“Side”屬性(例如,LeftSideTopSide)。

LayoutAnchorSide表示DockingManager“side”。若要使用LayoutAnchorSide,請將LayoutAnchorable元素添加到LayoutAnchorGroup,並將生成的LayoutAnchorGroup添加到LayoutAnchorSide的實例。然後將生成的LayoutAnchorSide分配給DockingManagerLayout屬性中保存的LayoutRoot對象的“Side”屬性(例如,LeftSideTopSide)。

注意:您可以在此處找到API的完整文檔。見活資源管理器,用於演示這個類的功能和其他源代碼的應用在這裏

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章