AvalonDock2:仅用于文档的LayoutItemTemplate

NGa*_*ier 3 c# wpf xaml avalondock

我目前正在使用AvalonDock2构建一个简单的UI。如果我正确理解,则可以使用LayoutItemTemplate为所有文档和可打印对象设置模板。

现在这是我的问题:我想拥有“硬编码”可锚定模板。所有可锚定对象如下所示:

<avalonDock:LayoutAnchorable Title="Dialogs" 
                             CanClose="False" 
                             CanHide="False" 
                             CanFloat="False">
    <integratorUI:Explorer DataContext="{Binding Path=Editor.ModelsDialogs}"/>
</avalonDock:LayoutAnchorable>
Run Code Online (Sandbox Code Playgroud)

另一方面,我的中央文档窗格正在通过

DocumentsSource="{Binding Path=Editor.EditingModelObjects}"
Run Code Online (Sandbox Code Playgroud)

对于那些文档,设置模板很有意义,因此我可以使用ContentControl并选择适当的样式,如下所示

<Style x:Key="DocumentStyle" TargetType="ContentControl">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=Type}" Value="{x:Static Member=integratorCore:ModelObjectType.Npc}">
            <DataTrigger.Setters>
                <Setter Property="Template" Value="{StaticResource ResourceKey=NpcViewTemplate}"/>
            </DataTrigger.Setters>
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=Type}" Value="{x:Static Member=integratorCore:ModelObjectType.Room}">
            <DataTrigger.Setters>
                <Setter Property="Template" Value="{StaticResource ResourceKey=RoomViewTemplate}"/>
            </DataTrigger.Setters>
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=Type}" Value="{x:Static Member=integratorCore:ModelObjectType.Dialog}">
            <DataTrigger.Setters>
                <Setter Property="Template" Value="{StaticResource ResourceKey=DialogViewTemplate}"/>
            </DataTrigger.Setters>
        </DataTrigger>
    </Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)

现在的问题是,设置LayoutItemTemplate会覆盖我的锚点的硬编码内容...

我怎样才能同时对固定锚和模板化文档进行硬编码?就像在旧的AvalonDock版本中一样,或者我应该如何在新版本中正确处理呢?

这是完整的DockingManager:

<avalonDock:DockingManager x:Name="dockingManager"
                           Grid.Row="2"
                           DocumentsSource="{Binding Path=Editor.EditingModelObjects}"
                           DocumentClosing="DockingManagerDocumentClosing">

    <avalonDock:DockingManager.Theme>
        <avalonDock:ExpressionDarkTheme/>
    </avalonDock:DockingManager.Theme>

    <!--<avalonDock:DockingManager.LayoutItemTemplate>
        <DataTemplate>
            <ContentControl Style="{StaticResource LayoutItemStyle}" />
        </DataTemplate>
    </avalonDock:DockingManager.LayoutItemTemplate>-->

    <avalonDock:DockingManager.DocumentHeaderTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=Content.Type.Name}"/>
        </DataTemplate>
    </avalonDock:DockingManager.DocumentHeaderTemplate>

    <avalonDock:LayoutRoot>
        <avalonDock:LayoutPanel Orientation="Horizontal">
            <avalonDock:LayoutAnchorablePane DockWidth="350">
                <avalonDock:LayoutAnchorable Title="Dialogs" CanClose="False" CanHide="False" CanFloat="False">
                    <integratorUI:Explorer DataContext="{Binding Path=Editor.ModelsDialogs}"/>
                </avalonDock:LayoutAnchorable>
                <avalonDock:LayoutAnchorable Title="NPCs" CanClose="False" CanHide="False" CanFloat="False">
                    <integratorUI:Explorer DataContext="{Binding Path=Editor.ModelsNpcs}"/>
                </avalonDock:LayoutAnchorable>
                <avalonDock:LayoutAnchorable Title="Rooms" CanClose="False" CanHide="False" CanFloat="False">
                    <integratorUI:Explorer DataContext="{Binding Path=Editor.ModelsRooms}"/>
                </avalonDock:LayoutAnchorable>
                <avalonDock:LayoutAnchorable Title="TileSet" CanClose="False" CanHide="False" CanFloat="False">
                    <integratorUI:Explorer DataContext="{Binding Path=Editor.ModelsTileSets}"/>
                </avalonDock:LayoutAnchorable>
                <avalonDock:LayoutAnchorable Title="Zones" CanClose="False" CanHide="False" CanFloat="False">
                    <integratorUI:Explorer DataContext="{Binding Path=Editor.ModelsZones}"/>
                </avalonDock:LayoutAnchorable>
            </avalonDock:LayoutAnchorablePane>

            <avalonDock:LayoutDocumentPane x:Name="documentPane">
            </avalonDock:LayoutDocumentPane>

            <avalonDock:LayoutAnchorablePane DockWidth="300">
                <avalonDock:LayoutAnchorable Title="Context" 
                                             CanClose="False" 
                                             CanHide="False" 
                                             CanFloat="False">
                    <TextBox/>
                </avalonDock:LayoutAnchorable>
            </avalonDock:LayoutAnchorablePane>

        </avalonDock:LayoutPanel>

        <avalonDock:LayoutRoot.BottomSide>
            <avalonDock:LayoutAnchorSide>
                <avalonDock:LayoutAnchorGroup>

                    <avalonDock:LayoutAnchorable Title="Console"
                                                 CanClose="False" 
                                                 CanHide="False" 
                                                 CanFloat="False">
                        <TextBlock Text="Test"/>
                    </avalonDock:LayoutAnchorable>

                    <avalonDock:LayoutAnchorable Title="Error List"
                                                 CanClose="False" 
                                                 CanHide="False" 
                                                 CanFloat="False">
                        <TextBlock Text="Test"/>
                    </avalonDock:LayoutAnchorable>

                </avalonDock:LayoutAnchorGroup>
            </avalonDock:LayoutAnchorSide>
        </avalonDock:LayoutRoot.BottomSide>

    </avalonDock:LayoutRoot>
</avalonDock:DockingManager>
Run Code Online (Sandbox Code Playgroud)

bde*_*eem 5

您将要使用LayoutItemTemplateSelector来基于Document,Anchorable甚至是特定类型的Document或Anchorable选择适当的模板。

本示例来自AvalonDock源代码中的MVVMTestApp

通过将FileViewTemplate替换为DocumentTemplate,将FileStatsViewTemplate替换为AnchorableTemplate,可以实现所需的结果。

 <avalonDock:DockingManager.LayoutItemTemplateSelector>
    <local:PanesTemplateSelector>
        <local:PanesTemplateSelector.FileViewTemplate>
            <DataTemplate>
                <TextBox Text="{Binding TextContent, UpdateSourceTrigger=PropertyChanged}"/>
            </DataTemplate>
        </local:PanesTemplateSelector.FileViewTemplate>
        <local:PanesTemplateSelector.FileStatsViewTemplate>
            <DataTemplate>
                <StackPanel Orientation="Vertical">
                    <TextBlock Text="{Binding FileSize}"/>
                    <TextBlock Text="{Binding LastModified}"/>
                    <TextBox Text="test"/>
                </StackPanel>
            </DataTemplate>
        </local:PanesTemplateSelector.FileStatsViewTemplate>
    </local:PanesTemplateSelector>
</avalonDock:DockingManager.LayoutItemTemplateSelector>
Run Code Online (Sandbox Code Playgroud)