我目前正在使用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>
答案 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>