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}
,我希望它可以像这样工作:
- 我已经将我的来源设置为第
TemplatedParent
一个(我希望是Context Menu
) - 现在我正在尝试绑定到我的源(目前我希望是)的
Parent
(这是使用 的人的 UIControl )Context Menu
TemplatedParent
这是与此相关的所有内容的完整代码:
家长:
<Button Content="Button" ContextMenu="{DynamicResource ErrorPopup}"/>
带有控件模板的上下文菜单(它们存储在 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 才会显示上下文菜单。
这不起作用:
- 我将鼠标悬停在按钮上
- 上下文菜单不显示
这有效:
- 我右键单击按钮
- 上下文菜单出现
- 快速关闭
- 从鼠标悬停显示上下文菜单
- 我将光标移开 = 上下文菜单消失
- 我将光标移到里面=出现上下文菜单
这可能是因为上下文菜单实际上还不存在,直到我通过鼠标右键单击显式打开它?并且在初始化之后,触发器才会起作用?
解决方案
推荐阅读
- windows - 通过 GSUTIL 将文件从 Windows 10 文件夹上传到 Gcloud 存储桶时出现问题
- amazon-web-services - 自动选择子网参数值
- android - 我可以管理生命周期所有者,用 Koin 注入 viewModel 吗?
- topbraid-composer - “运行推理”在 Maestro 版本中不起作用
- python - 'IndexError: list index out of range' 当我使用 python split 来字符串包含中文时
- node.js - 为什么外部js文件加载不出来
- php - 使用 .htaccess 更改所有 URL 结构
- javascript - 如何根据另一个数组的顺序将键的值放入数组中的对象中
- docker - 第一次启动时如何避免jenkins覆盖/var/jenkins_home
- mysql - mysql 百分比 2 位小数