I've got a simple button where I want the context menu's width to be the same width as the button (I'm making the left click of the button open the context menu directly below the button).
<Button x:Name="btn" Content="Push Me">
<Button.ContextMenu>
<ContextMenu x:Name="cm">
开发者_JAVA百科 <MenuItem Header="One" />
<MenuItem Header="Two" />
<MenuItem Header="Three" />
</ContextMenu>
</Button.ContextMenu>
</Button>
I've tried the following binding on the context menu itself and it doesn't work
<ContextMenu x:Name="cm" Width="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Button}}, Path=ActualWidth}">
But, I've been able to get it working in code
btn.LayoutUpdated += (s, e) => cm.Width = btn.ActualWidth;
My question is... Does a xaml binding exist that will get me this functionality?
ContextMenu
has a Property called PlacementTarget
which in this case will be the Button
so you can try to use in the Path for the Binding
<ContextMenu x:Name="cm"
Width="{Binding RelativeSource={RelativeSource Self},
Path=PlacementTarget.ActualWidth}">
This has to do with the way in which the ContextMenu
behaves with regard to its NameScope
. If you analyze the ContextMenu
in the debugger you willl note its parent is a Popup
and the parent of the Popup
is null.
One of the workarounds noted on the MSDN forums is to adjust the NameScope
which will then allow the ContextMenu
to behave as you would expect.
NameScope.SetNameScope(this, new NameScope());
This is obviously going to take place in the code behind as is your other approach; neither being optimal.
精彩评论