首页 > 解决方案 > 如何在 XAML 中指向上下文菜单的父级?

问题描述

我已经搜索了很多,但我发现的大多数解决方案都是来自人们询问如何在 C# 中做到这一点。我既想练习我的 XAML,又想减少我已经很乱的 C# 代码,所以我决定在 XAML 上尝试一下。

我试过的:

我为上下文菜单创建了一个模板,这是我的代码:

<ControlTemplate TargetType="ContextMenu">
    <Grid>
        <!-- Some Content -->
    </Grid>
    <ControlTemplate.Triggers>
        <DataTrigger Binding="{Binding Parent.IsMouseOver, RelativeSource={RelativeSource TemplatedParent}}" Value="True">
            <Setter Property="IsOpen" Value="True"/>
        </DataTrigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

我对代码的理解:

我想象层次结构是这样的:

Parent UIControl (Can be a button, textbox, etc)
|---> Context Menu
      |---> Template

因此,使用我的代码Binding Parent.IsMouseOver, RelativeSource={RelativeSource TemplatedParent},我希望它可以像这样工作:

  1. 我已经将我的来源设置为第TemplatedParent一个(我希望是Context Menu
  2. 现在我正在尝试绑定到我的源(目前我希望是)的Parent(这是使用 的人的 UIControl )Context MenuTemplatedParent

这是与此相关的所有内容的完整代码:

  1. 家长:

    <Button Content="Button" ContextMenu="{DynamicResource ErrorPopup}"/>

  2. 带有控件模板的上下文菜单(它们存储在 ResourceDictionary 中,因为它们将被其他控件重用以显示它们自己的每个错误):

-

<ContextMenu x:Key="ErrorPopup" x:Shared="False">
    <ContextMenu.Style>
        <Style TargetType="ContextMenu">
            <Setter Property="IsOpen" Value="False"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ContextMenu">
                        <Grid>
                            <!-- Some Content -->
                        </Grid>
                        <ControlTemplate.Triggers>
                            <DataTrigger Binding="{Binding Parent.IsMouseOver, RelativeSource={RelativeSource TemplatedParent}}" Value="True">
                                <Setter Property="IsOpen" Value="True"/>
                            </DataTrigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ContextMenu.Style>
</ContextMenu>

我的期望:

当我将光标放在按钮顶部时,我希望上下文菜单会弹出。

更新:

我已经取得了一些进展,我尝试将绑定更改为:

<DataTrigger Binding="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType=Button,Mode=FindAncestor}}" Value="True">
    <Setter Property="IsOpen" Value="True"/>
</DataTrigger>

不幸的是,它显示了一些奇怪的行为,其中只有当我使用鼠标右键单击强制打开上下文菜单时,MouseOver 才会显示上下文菜单。

这不起作用:

  1. 我将鼠标悬停在按钮上
  2. 上下文菜单不显示

这有效:

  1. 我右键单击按钮
  2. 上下文菜单出现
  3. 快速关闭
  4. 从鼠标悬停显示上下文菜单
  5. 我将光标移开 = 上下文菜单消失
  6. 我将光标移到里面=出现上下文菜单

这可能是因为上下文菜单实际上还不存在,直到我通过鼠标右键单击显式打开它?并且在初始化之后,触发器才会起作用?

标签: wpfxaml

解决方案


推荐阅读