AvalonDock 2.2 - Полная ширина TitleTemplate (заполнить родительский контейнер)

Привет всем!

Я создал шаблон заголовка в 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), контекстное меню запускается только в начале области заголовка (а не справа от звездочки).

Я предполагаю, что должен сказать контейнеру заполнить его родительский контейнер, но я не могу понять, как это сделать. Я использовал StackPanel, Grid, DockPanel (LastChildFill = "True") с HorizontalAlignment установленным на Stretch. Какой контейнер следует использовать? Что мне не хватает?

P.S.: Я могу отвечать на ваши ответы только еще 12 часов, потом меня не будет на время (неделю). Но я не брошу этот вопрос, пока на него не ответят :) Спасибо за терпение.


person Attila Klenik    schedule 09.07.2014    source источник


Ответы (1)


Что ж, решение было довольно простым. Я завернул StackPanel в метку. Теперь контекстное меню может вызываться для каждого пикселя в заголовке. Теперь шаблон выглядит так:

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

Я люблю простые решения.

person Attila Klenik    schedule 23.07.2014
comment
Пришлось изменить DataType={x:Type ad:LayoutContent} на DataType={x:Type ad:LayoutAnchorable} с моей стороны, поскольку LayoutContent не существует (v.2.5) - person lionheart; 22.12.2015