AvalonDock 2.2 - 全宽TitleTemplate(填充父容器)

时间:2014-07-09 13:18:39

标签: c# wpf xaml avalondock

大家好!

我在AvalonDock 2.2(WPF Toolkit)中创建了一个标题模板。问题是LayoutAnchorable的上下文菜单仅在我右键单击包含某些内容的标题部分(而不是可锚定的整个宽度)时触发。

以下是我现在使用的相关代码段:

<ad:DockingManager x:Class="Pdn.Gui.Docking.Control.DockingSystem" ...
    AnchorablesSource="{Binding Path=Panels}">
    <ad:DockingManager.Resources>
        <DataTemplate x:Key="DockingWindowTitleDataTemplate" DataType="{x:Type ad:LayoutContent}">
            <StackPanel ToolTip="{Binding Path=Content.ToolTip}" Orientation="Horizontal" HorizontalAlignment="Stretch">
                <Image MaxHeight="16" MaxWidth="16" VerticalAlignment="Center"
                       Source="{Binding Path=Content.IconSource, Converter={StaticResource IconToImageSourceConverter}}" />
                <TextBlock Text="{Binding Path=Content.Name}" Margin="5,0,0,0" VerticalAlignment="Center"/>
                <TextBlock Text="*" Visibility="{Binding Path=Content.DirtySignVisibility}" VerticalAlignment="Center"/>
            </StackPanel>
        </DataTemplate>

        <DataTemplate x:Key="DockingWindowTitleGridDataTemplate" DataType="{x:Type ad:LayoutContent}">
            <Grid ToolTip="{Binding Path=Content.ToolTip}" HorizontalAlignment="Stretch">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Image Grid.Column="0" MaxHeight="16" MaxWidth="16" VerticalAlignment="Center"
                       Source="{Binding Path=Content.IconSource, Converter={StaticResource IconToImageSourceConverter}}" />
                <TextBlock Grid.Column="1" Text="{Binding Path=Content.Name}" Margin="5,0,0,0" VerticalAlignment="Center"/>
                <TextBlock Grid.Column="2" Text="*" Visibility="{Binding Path=Content.DirtySignVisibility}" VerticalAlignment="Center"/>
            </Grid>
        </DataTemplate>

        <DataTemplate x:Key="DefaultPanelTitle">
            <TextBlock Text="{Binding Path=Content.Name}" TextTrimming="CharacterEllipsis" />
        </DataTemplate>

        ...
    </ad:DockingManager.Resources>

    <ad:DockingManager.AnchorableTitleTemplate>
        <StaticResource ResourceKey="DockingWindowTitleDataTemplate" />
    </ad:DockingManager.AnchorableTitleTemplate>

    ...
</ad:DockingManager>

当我使用DefaultPanelTitle模板(这是主题的默认模板)时,一切都很好,上下文菜单会在标题部分的整个宽度上触发。

但是,当我使用其他两个模板(Image-Name-IsDirty元素)时,仅在标题区域的开头触发上下文菜单(而不是右边的星号)。

我猜我应该告诉容器填充其父容器,但我无法弄清楚如何。我使用StackPanelGridDockPanelLastChildFill = "True")并将HorizontalAlignment设置为Stretch。我应该使用什么样的容器? 我错过了什么?

P.S。:我只能回答你12个小时的答案,然后我已经离开了一段时间(一周)。但是,在我回答之前,我不会放弃这个问题:)感谢您的耐心等待。

1 个答案:

答案 0 :(得分:2)

嗯,解决方案非常简单。我将StackPanel包装在Label中。现在可以在标题部分的每个像素上触发上下文菜单。模板现在看起来像这样:

<ad:DockingManager x:Class="Pdn.Gui.Docking.Control.DockingSystem" ...
    AnchorablesSource="{Binding Path=Panels}">
    <ad:DockingManager.Resources>
        <DataTemplate x:Key="DockingWindowTitleDataTemplate" DataType="{x:Type ad:LayoutContent}">
            <Label>
                <StackPanel ToolTip="{Binding Path=Content.ToolTip}" Orientation="Horizontal" HorizontalAlignment="Stretch">
                    <Image MaxHeight="16" MaxWidth="16" VerticalAlignment="Center" 
                        Source="{Binding Path=Content.IconSource, Converter={StaticResource IconToImageSourceConverter}}" />
                    <TextBlock Text="{Binding Path=Content.Name}" Margin="5,0,0,0" VerticalAlignment="Center"/>
                    <TextBlock Text="*" Visibility="{Binding Path=Content.DirtySignVisibility}" VerticalAlignment="Center"/>
                </StackPanel>
            </Label>
        </DataTemplate>

        ...
    </ad:DockingManager.Resources>

    <ad:DockingManager.AnchorableTitleTemplate>
        <StaticResource ResourceKey="DockingWindowTitleDataTemplate" />
    </ad:DockingManager.AnchorableTitleTemplate>

    ...
</ad:DockingManager>

我喜欢简单的解决方案。