gpt4 book ai didi

wpf - 将 ContextMenu 的来源传递给 WPF 命令

转载 作者:行者123 更新时间:2023-12-04 17:29:06 29 4
gpt4 key购买 nike

与从上下文菜单项触发命令有关的有趣问题...

我想触发一个命令以在我的控件 InsertRowCmd 中插入一行。该命令需要知道在哪里插入行。

我可以使用 Mouse.GetPosition(),但这会让我获得当前鼠标的位置,这将在菜单项上方。我想获取上下文菜单的来源。

有人对如何将上下文菜单的来源作为参数传递给命令有任何建议吗?

示例代码:

<UserControl x:Name="MyControl">
<!--...-->
<ContextMenu x:Name="menu">
<MenuItem Header="Insert Row" Command="{x:Static customCommands:MyCommands.InsertRowCmd}" CommandParameter="?"/>
</ContextMenu>
</UserControl>

我目前的想法如下:

- 改用点击处理程序,以便我可以在代码中找到原点。问题是我将不得不处理启用/禁用。

- 处理点击事件并保存上下文菜单的来源。将此保存的信息传递到命令中。我已经验证在命令执行之前点击事件会触发。

有任何想法吗?

编辑:

我正在使用 Josh Smith 的 CommandSinkBinding将命令处理路由到我的 ViewModel 类中。所以处理命令执行的代码对 View 一无所知。

最佳答案

您需要使用 TranslatePoint 翻译 ContextMenu 的左上角 (0, 0)到包含网格中的坐标。您可以通过绑定(bind) CommandParameter 来实现。到ContextMenu并使用转换器:

CommandParameter="{Binding IsOpen, ElementName=_menu, Converter={StaticResource PointConverter}}"

另一种方法是附加行为,它会自动更新类型为 Point 的附加只读属性。每当 ContextMenu被打开。用法看起来像这样:
<ContextMenu x:Name="_menu" local:TrackBehavior.TrackOpenLocation="True">
<MenuItem Command="..." CommandParameter="{Binding Path=(local:TrackBehavior.OpenLocation), ElementName=_menu}"/>
</ContextMenu>

所以 TrackOpenLocation附加属性执行附加到 ContextMenu 的工作并在 OpenLocation 时更新第二个附加属性 ( ContextMenu )被打开。然后 MenuItem可以绑定(bind)到 OpenLocation获取 ContextMenu 所在的位置上次打开。

关于wpf - 将 ContextMenu 的来源传递给 WPF 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1009571/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com