【问题标题】:Child MenuItems are not expanding子菜单项未扩展
【发布时间】:2019-10-01 12:44:45
【问题描述】:

我有一个简单的弹出控件,其中包含多个MenuItem

<Popup
    IsOpen="{Binding ShowPopupMenu}"
    <StackPanel Background="White">
        <ItemsControl>
            <MenuItem Header="Open file..." />
            <MenuItem Header="Settings" />
            
            <!-- Nested items -->
            <MenuItem Header="Test">
                <MenuItem Header="Nested Item" />
                <MenuItem Header="Nested Item" />
                <MenuItem Header="Nested Item" />
                <MenuItem Header="Nested Item" />
                <MenuItem Header="Nested Item" />
            </MenuItem>
            
            <MenuItem Header="Exit" />
        </ItemsControl>
    </StackPanel>
</Popup>

我的问题是带有标题TestMenuItem,包含嵌套的子元素在鼠标悬停时没有展开。

我实际上能够看到它在设计时扩展

,

但是,当它根本无法在运行时运行时。

有什么想法吗?

【问题讨论】:

  • 您能否展示可能对我们有帮助的代码。
  • 为什么不使用菜单?
  • @EdPlunkett 那有什么不同?
  • @DonaldDuck 它有效。
  • @EdPlunkett 你非常友善和乐于助人。这个网站肯定需要更多像你这样的人。

标签: c# wpf xaml popup controls


【解决方案1】:

问题似乎在于 Popup 控件处理鼠标单击事件,因此它没有到达您的菜单项,请尝试通过处理 PreviewLeftButton 事件手动打开它:

<StackPanel x:Name="Panel">
    <Popup PlacementTarget="{Binding ElementName=Panel}" 
        IsOpen="True">
        <StackPanel Background="White">
            <!--<Menu>-->
                <MenuItem Header="Open file..." />
                <MenuItem Header="Settings" />

                <!-- Nested items -->
                <MenuItem Header="Test" Click="MenuItem_OnClick" PreviewMouseLeftButtonDown="UIElement_OnPreviewMouseLeftButtonDown">
                    <MenuItem Header="Nested Item" />
                    <MenuItem Header="Nested Item" />
                    <MenuItem Header="Nested Item" />
                    <MenuItem Header="Nested Item" />
                    <MenuItem Header="Nested Item" />
                </MenuItem>

                <MenuItem Header="Exit" />
            <!--</Menu>-->
        </StackPanel>
    </Popup>
</StackPanel>

还有:

private void UIElement_OnPreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    ((MenuItem)sender).IsSubmenuOpen = true;
}

编辑

我的错误,问题与未处理的 Click 事件无关。我只是在堆栈面板中放了一个按钮,它就起作用了。问题在于,当 MenuItem 具有子项时,不会触发单击事件,如果根菜单项不是 MenuContextMenu 控件的“子”,则必须手动处理子菜单的状态。这些控件已经处理了,但是由于您正在实现自己的“ContextMenu”,因此您必须自己实现该行为

【讨论】:

  • 那为什么不使用触发器呢?
  • @DonaldDuck 我不知道如何实现。为了定义这样的触发器,您需要连接到 Test MenuItem 中的一个属性,一些 IsMousePressedOver 属性,但不幸的是,这样的属性不存在。一种更可重用的方法是定义自定义行为。
  • 我认为子菜单会在悬停时展开,所以在那种情况下可能是这样的? pastebin.com/MyPy3Gip
【解决方案2】:

您可以将StyleTrigger 一起使用,将IsSubmenuOpen 属性设置为true

<Popup IsOpen="True">
    <StackPanel Background="White">
        <ItemsControl>
            <MenuItem Header="Open file..." />
            <MenuItem Header="Settings" />

            <!-- Nested items -->
            <MenuItem Header="Test">
                <MenuItem Header="Nested Item" />
                <MenuItem Header="Nested Item" />
                <MenuItem Header="Nested Item" />
                <MenuItem Header="Nested Item" />
                <MenuItem Header="Nested Item" />
                <MenuItem.Style>
                    <Style TargetType="MenuItem">
                        <Style.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="IsSubmenuOpen" Value="True" />
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </MenuItem.Style>
            </MenuItem>

            <MenuItem Header="Exit" />
        </ItemsControl>
    </StackPanel>
</Popup>

【讨论】:

  • 我刚刚尝试过这个解决方案,正如 cmets 对另一个答案所说的那样。唯一的问题是,当您在展开的子菜单上移动鼠标并点击子菜单和弹出窗口之间的spacing 时,子菜单将关闭。
  • @DonaldDuck:怎么会有空格?您在最初的问题中没有提到这一点。
  • 不知道,也许是默认样式?我没有覆盖任何东西。
  • 是否有足够的空间显示右侧的子菜单?
  • 不,由于弹出窗口出现在应用程序的右上角,子菜单出现在弹出窗口的左侧。
猜你喜欢
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
相关资源
最近更新 更多