AvalonDock 2.2 - Full width TitleTemplate (fill parent container)

匆匆过客 提交于 2019-12-11 19:30:44

问题


Hy everyone!

I created a title template in AvalonDock 2.2 (WPF Toolkit). The problem is that the context menu of the LayoutAnchorable is only triggered when I right-click on the part of the title that contains something (and not the entire width of the anchorable).

Here is the relevant code segment I'm using now:

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

When I use the DefaultPanelTitle template (which is the default template of the theme) everything is fine, the context menu is triggered on the full width of the title part.

However when I use the other two templates (Image-Name-IsDirty elements), the context menu is triggered only on the beginning of the title area (and not right to the asterix).

I'm guessing I should tell the container to fill its parent container, but I can't figure out how. I used StackPanel, Grid, DockPanel (LastChildFill = "True") with HorizontalAlignment set to Stretch. What kind of container should I use? What am I missing?

P.S.: I can only respond to your answers for another 12 hours, then I'm gone for a while (week). But I'm not abandoning this question until it's answered :) Thanks for your patience.


回答1:


Well, the solution was quite simple. I wrapped the StackPanel in a Label. Now the context menu can be triggered on every pixel in the title part. The template now looks like this:

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

I love simple solutions.



来源:https://stackoverflow.com/questions/24654829/avalondock-2-2-full-width-titletemplate-fill-parent-container

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!