带上下文菜单的WPF按钮,如何将上下文菜单宽度绑定到按钮的宽度?

时间:2011-03-01 18:22:23

标签: wpf binding

我有一个简单的按钮,我希望上下文菜单的宽度与按钮的宽度相同(我左键单击按钮打开按钮下方的上下文菜单)。

<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绑定?

2 个答案:

答案 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());

这显然将在你的另一种方法背后的代码中发生;既不是最佳的。