c# - AvalonDock2 : LayoutItemTemplate only for documents

标签 c# wpf xaml avalondock

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

现在这是我的问题:我想要“硬编码”的锚定模板。 Anchorables 看起来像这样:

<avalonDock:LayoutAnchorable Title="Dialogs" 
                             CanClose="False" 
                             CanHide="False" 
                             CanFloat="False">
    <integratorUI:Explorer DataContext="{Binding Path=Editor.ModelsDialogs}"/>
</avalonDock:LayoutAnchorable>

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

提供文档
DocumentsSource="{Binding Path=Editor.EditingModelObjects}"

对于那些文档,设置模板很有意义,所以我可以使用 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>

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

我怎样才能同时拥有硬编码的 anchor 和模板化文档?就像在旧的 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>

最佳答案

您需要使用 LayoutItemTemplateSelector 来根据 Document、Anchorable 或什至特定类型的 Document 或 Anchorable 选择适当的模板。

此示例来自 AvalonDock Source Code 中的 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>

关于c# - AvalonDock2 : LayoutItemTemplate only for documents,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18668705/

相关文章:

c# - 设计易于访问的PDF组件

c# - 如何在 ASP.Net Web API 中摄取大量日志

c# - 强制 DataGrid 列验证 (WPF)

c# - Catel 框架 - 替换 View

c# - 关闭/删除选项卡项 WPF

WPF GridSplitter - 保存和恢复位置并按比例拆分

c# - 下载 Amazon S3 对象,Windows 说文件已损坏

c# - 如果我使用 Task.Wait() 而不是等待,则不会显示 MessageDialog 任务

c# - 在由多个 View 模型绑定(bind)的 View 中绑定(bind)图像不起作用

c# - 错误 : Must create DependencySource on same Thread as the DependencyObject even by using Dispatcher