我已经搜索了很多,但是我发现的大多数解决方案都是来自询问如何在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
的{{1}}(这是使用Context Menu
的用户的UIControl) )以下是与此有关的所有内容的完整代码:
父母:
TemplatedParent
带有控件模板的上下文菜单(它们存储在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仅在我事先用鼠标右键单击强制打开上下文菜单时才会显示上下文菜单。
这不起作用:
这有效:
这可能是因为上下文菜单实际上还不存在,直到我通过鼠标右键单击显式打开它为止?初始化之后,触发器才起作用吗?