如何在XAML中指向上下文菜单的父级?

时间:2019-07-14 10:58:40

标签: wpf 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的{​​{1}}(这是使用Context Menu的用户的UIControl) )

以下是与此有关的所有内容的完整代码:

  1. 父母:

    TemplatedParent

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

-

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

我的期望:

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

更新:

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

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

不幸的是,它显示出一些奇怪的行为,其中MouseOver仅在我事先用鼠标右键单击强制打开上下文菜单时才会显示上下文菜单。

这不起作用:

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

这有效:

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

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

0 个答案:

没有答案