WPF菜单项未填满可用的上下文菜单空间。

3
我使用MahApps.Metro创建了一个简单的ContextMenu,但是遇到了奇怪的问题。当将光标移动到文本上方或稍微周围移动时,没有问题。但是当将其移动得更远,仍然在ContextMenu范围内时,光标就不再位于MenuItem上。此时点击也不会有任何操作,除了关闭ContextMenu。

输入图像描述 输入图像描述

<ContextMenu ItemsSource="{Binding ContextItems}">
    <ContextMenu.ItemTemplate>
        <DataTemplate>
            <MenuItem Header="{Binding Text}" Command="{Binding Command}"/>
        </DataTemplate>
    </ContextMenu.ItemTemplate>
</ContextMenu>

我做错了什么?为什么 MenuItem 没有使用可用的空间?

2
我刚刚为自己发现了这个问题。在我看来,由于某种原因,它似乎实际上添加了两个菜单项,一个作为另一个的内容。这就是为什么它们居中(而不是默认左对齐),更大并且按下处理不正确的原因 - 因为它在奇怪的空项目上触发事件,该项目包含实际项目。这非常令人沮丧。目前还没有找到解决方案。 - Joe
2个回答

5
如果您的ContextItems包含一个带有视图模型的集合,那么我认为以下代码可能会对您有所帮助(未经测试):
<ContextMenu ItemsSource="{Binding ContextItems}">
    <ContextMenu.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="Header" Value="{Binding Text}" />
            <Setter Property="Command" Value="{Binding Command}" />
        </Style>
    </ContextMenu.ItemContainerStyle>
</ContextMenu>

命令和文本应该是视图模型对象上的属性。


相关问题的好解释:https://dev59.com/6ZDea4cB1Zd3GeqPhNUZ#33677759 - Brains

2

我并没有使用过MahApps.Metro。不过你可以像这样覆盖模板:

                <ContextMenu.ItemTemplate>
                <DataTemplate>
                      <MenuItem Header="{Binding Text}" Command="{Binding Command}"/>
                        <MenuItem.Template>
                            <ControlTemplate>
                                    <ContentPresenter Content="{Binding Header,RelativeSource={RelativeSource TemplatedParent}}">
                                    </ContentPresenter>
                            </ControlTemplate>
                        </MenuItem.Template>
                        </MenuItem>
                </DataTemplate>
            </ContextMenu.ItemTemplate>

我希望这能对您有所帮助。


是的,菜单项周围的边框消失了 - 是否也有一种方法来拉伸该项以适应正常大小的上下文菜单?即使没有,感谢您的快速回复! - Florian Koch
刚刚发现一个问题:现在只有文本可点击,所有的空格都不能触发命令... - Florian Koch
尝试将ContentPresenter包装在Grid中,如<Grid><ContentPresenter....../></Grid>。 - yo chauhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接