我有一个简单的按钮,我希望上下文菜单的宽度与按钮的宽度相同(我左键单击按钮打开按钮下方的上下文菜单)。
<Button x:Name="btn" Content="Push Me">
<Button.ContextMenu>
<ContextMenu x:Name="cm">
<MenuItem Header="One" />
<MenuItem Header="Two" />
<MenuItem Header="Three" />
</ContextMenu>
</Button.ContextMenu>
</Button>
我在上下文菜单上尝试了以下绑定,但它不起作用
<ContextMenu x:Name="cm" Width="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Button}}, Path=ActualWidth}">
但是,我已经能够使用代码
了btn.LayoutUpdated += (s, e) => cm.Width = btn.ActualWidth;
我的问题是......是否存在能够让我获得此功能的xaml绑定?
答案 0 :(得分:5)
ContextMenu
有一个名为PlacementTarget
的属性,在这种情况下将是Button
,因此您可以尝试在Binding
的路径中使用
<ContextMenu x:Name="cm"
Width="{Binding RelativeSource={RelativeSource Self},
Path=PlacementTarget.ActualWidth}">
答案 1 :(得分:2)
这与ContextMenu
关于其NameScope
的行为方式有关。如果您分析调试器中的ContextMenu
,您会注意到它的父项是Popup
,而Popup
的父项是空的。
MSDN论坛上提到的workarounds之一是调整NameScope
,然后ContextMenu
可以按照您的预期行事。
NameScope.SetNameScope(this, new NameScope());
这显然将在你的另一种方法背后的代码中发生;既不是最佳的。