0

我正在尝试完全按照此处描述的方式进行操作,但使用 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;
    }
4

1 回答 1

1

您需要设置ContextMenuService.PlacementTarget属性,以便框架知道上下文菜单应相对于哪个元素定位,例如:

<Rectangle x:Name="rectangle" ContextMenuService.PlacementTarget="{Binding RelativeSource={RelativeSource Self}}" ... />

只需将该属性添加到您的 Rectangle 声明中。与 结合使用时ContextMenuService.Placement="Bottom",上下文菜单将按照您的预期显示在底部。

编辑:由于您以编程方式打开菜单,因此您需要直接在菜单本身上设置Placementand属性。PlacementTarget的附加属性ContextMenuService,当在菜单的所有者上设置时,只有在上下文菜单通过常规方式打开时才会生效,例如右键单击。在您的 MouseDown 处理程序中,您正在设置PlacementTarget = this;,但您应该设置PlacementTarget = rectangle;

于 2013-06-20T21:54:11.150 回答