AvalonDock 2:仅适用于文档的布局项模板

时间:2013-09-07 01:15:45

标签: c# wpf xaml avalondock

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

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

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

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

提供文档
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会覆盖我的anchorables的硬编码内容......

我怎么能同时拥有硬编码的锚点和模板文件?就像旧的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>

1 个答案:

答案 0 :(得分:4)

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

此示例来自AvalonDock Source Code中的MVVMTestApp。

通过为FileTemplate交换FileViewTemplate和为AnchorableTemplate交换FileStatsViewTemplate,可以获得所需的结果

 <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>