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

Хей всички!

Създадох шаблон за заглавие в AvalonDock 2.2 (WPF Toolkit). Проблемът е, че контекстното меню на LayoutAnchorable се задейства само когато щракна с десния бутон върху частта от заглавието, която съдържа нещо (а не цялата ширина на anchorable).

Ето съответния кодов сегмент, който използвам сега:

<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