我正在尝试完全按照此处描述的方式进行操作,但使用 Rectangle 而不是 Button 除外。我做了答案中描述的事情(在许多其他事情中),但我无法让它显示为相对于矩形(在我的情况下被按钮使用)。
我使用矩形作为按钮是因为我不喜欢按钮的鼠标悬停效果,而且使用矩形似乎比构建自定义按钮更容易。请注意,即使在 Expression Blend 4 中使用按钮时,我也遇到了同样的问题。
这是我的矩形的 XAML:
<Rectangle x:Name="rectangle" HorizontalAlignment="Left" MouseDown="MenuClicked" Height="55" VerticalAlignment="Top" Width="135" Grid.ColumnSpan="2" Margin="0,1,0,0" ContextMenuService.Placement="Bottom">
<Rectangle.ContextMenu>
<ContextMenu x:Name="Menu" >
<MenuItem x:Name="LoadXML" Header="Load XML" Command="{Binding Command}" CommandParameter="BrowseXML"/>
<MenuItem x:Name="SaveXML" Header="Save XML" Command="{Binding Command}" CommandParameter="SaveXML"/>
<MenuItem x:Name="SaveBinary" Header="Save Binary" Command="{Binding Command}" CommandParameter="SaveBinary"/>
<MenuItem x:Name="SaveText" Header="Save Text" Command="{Binding Command}" CommandParameter="SaveText"/>
</ContextMenu>
</Rectangle.ContextMenu>
<Rectangle.Fill>
<ImageBrush ImageSource="Resources/Logo.png" Stretch="Uniform" />
</Rectangle.Fill>
</Rectangle>
这仍然会直接在鼠标单击点旁边显示上下文菜单。如果我在上下文菜单代码中将 Placement 设置为底部,而不是将 ContextMenuService 位添加到 Rectangle,它会将其显示在相对于整个窗口的底部或顶部。
任何帮助,将不胜感激。谢谢!
编辑:我还使用一种方法来启用矩形的左键单击。在 MouseDown 上,它调用此方法:
private void MenuClicked(object sender, System.Windows.RoutedEventArgs e)
{
Menu.PlacementTarget = this;
Menu.IsOpen = true;
}