AvalonDock 2.2 - 全宽 TitleTemplate(填充父容器) [英] AvalonDock 2.2 - Full width TitleTemplate (fill parent container)

查看:15
本文介绍了AvalonDock 2.2 - 全宽 TitleTemplate(填充父容器)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好!

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

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>

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

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.

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

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

我猜我应该告诉容器填充其父容器,但我不知道如何.我使用 StackPanelGridDockPanel (LastChildFill = "True") 和 Horizo​​ntalAlignment> 设置为 Stretch.我应该使用什么样的容器?我错过了什么?

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.:我只能再回复你 12 个小时的答案,然后我会离开一段时间(一周).但我不会放弃这个问题,直到它得到回答:) 感谢您的耐心等待.

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.

推荐答案

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

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.

这篇关于AvalonDock 2.2 - 全宽 TitleTemplate(填充父容器)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆