【问题标题】:WPF Application loses focus when sub menu closed子菜单关闭时 WPF 应用程序失去焦点
【发布时间】:2016-11-17 12:56:46
【问题描述】:

我在 wpf 应用程序中有一个菜单和子菜单,当从子菜单项中删除鼠标指针时,应用程序失去了焦点。例如,按钮悬停不能正常工作。但是当我点击应用程序的空白区域时,按钮悬停效果正常。

预期的行为是,按钮不应该失去它的样式/动作。

悬停效果:

没有悬停效果:

控制模板如下

<ControlTemplate x:Key="MenuItemControlTemplate" TargetType="{x:Type MenuItem}">
        <Border x:Name="templateRoot" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
            <Grid VerticalAlignment="Center">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>
                <ContentPresenter ContentTemplate="{TemplateBinding HeaderTemplate}" Content="{TemplateBinding Header}" Grid.Column="1" ContentStringFormat="{TemplateBinding HeaderStringFormat}" ContentSource="Header" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                <Popup x:Name="PART_Popup" 
                       AllowsTransparency="True"
                       Focusable="True" IsOpen="{Binding IsSubmenuOpen, RelativeSource={RelativeSource TemplatedParent}}" PopupAnimation="{DynamicResource {x:Static SystemParameters.MenuPopupAnimationKey}}" Placement="Bottom">
                    <Border x:Name="SubMenuBorder" BorderBrush="#FF999999" BorderThickness="1" Background="#FFF0F0F0" Padding="2,10,0,0">
                        <ScrollViewer x:Name="SubMenuScrollViewer" Style="{DynamicResource {ComponentResourceKey ResourceId=MenuScrollViewer, TypeInTargetAssembly={x:Type FrameworkElement}}}">
                            <Grid RenderOptions.ClearTypeHint="Enabled">
                                <Canvas HorizontalAlignment="Left" Height="0" VerticalAlignment="Top" Width="0">
                                    <Rectangle x:Name="OpaqueRect" Fill="{Binding Background, ElementName=SubMenuBorder}" Height="{Binding ActualHeight, ElementName=SubMenuBorder}" Width="{Binding ActualWidth, ElementName=SubMenuBorder}"/>
                                </Canvas>
                                <Rectangle Fill="#FFD7D7D7" HorizontalAlignment="Left" Margin="29,2,0,2" Width="1"/>
                                <ItemsPresenter x:Name="ItemsPresenter" KeyboardNavigation.DirectionalNavigation="Cycle" Grid.IsSharedSizeScope="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" KeyboardNavigation.TabNavigation="Cycle"/>
                            </Grid>
                        </ScrollViewer>
                    </Border>
                </Popup>
            </Grid>
        </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="IsSuspendingPopupAnimation" Value="True">
                <Setter Property="PopupAnimation" TargetName="PART_Popup" Value="None"/>
                <Setter Property="Background" TargetName="templateRoot" Value="#FFFFFF"/>
                <Setter Property="BorderBrush" TargetName="templateRoot" Value="#FFFFFF"/>
            </Trigger>

            <Trigger Property="CanContentScroll" SourceName="SubMenuScrollViewer" Value="False">
                <Setter Property="Canvas.Top" TargetName="OpaqueRect" Value="{Binding VerticalOffset, ElementName=SubMenuScrollViewer}"/>
                <Setter Property="Canvas.Left" TargetName="OpaqueRect" Value="{Binding HorizontalOffset, ElementName=SubMenuScrollViewer}"/>
            </Trigger>

            <Trigger Property="IsHighlighted" Value="True">
                <Setter Property="Background" TargetName="templateRoot" Value="#FF666565"/>
                <Setter Property="BorderBrush" TargetName="templateRoot" Value="#FFE0D3D3"/>
            </Trigger>
            <Trigger Property="IsMouseOver" Value="True" >
                <Setter Property="IsOpen" TargetName="PART_Popup" Value="True"/>
                <Setter Property="Cursor" Value="Hand"/>
            </Trigger>
            <Trigger Property="IsEnabled" Value="False">
                <Setter Property="TextElement.Foreground" TargetName="templateRoot" Value="#FF707070"/>
            </Trigger>
            <Trigger Property="IsMouseOver" Value="False" >
                <Setter Property="Background" TargetName="templateRoot" Value="#FFFFFF"/>
                <Setter Property="BorderBrush" TargetName="templateRoot" Value="#FFDDDDDD"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>

【问题讨论】:

  • 你是在使用一些 UI 框架还是只使用 WPF?
  • 我正在使用原始 WPF

标签: c# wpf


【解决方案1】:

如果我说得对,你并不是说应用程序失去了焦点(事实上它没有,当你点击 TAB 时你可以看到),但除了打开的子菜单和相应的主菜单之外什么都没有鼠标。

这是 WPF 应用程序中打开弹出窗口时的标准行为。打开上下文菜单时也是如此。在 WinForms 应用程序中也是如此。

您也可以在 Visual Studio 中进行检查。

编辑

所以我们有一个应用主菜单

当您单击菜单项并在子菜单上移动鼠标(未按下按钮)时,您会得到这个

在移动之后(仍然没有按下按钮,只是移动)一直到子菜单下方

子菜单关闭?如果这是真的,您应该查看菜单定义(并可能在此处发布),因为这不是标准的菜单行为。

【讨论】:

  • 我担心的是,当我打开子菜单并从子菜单项移动光标时,子菜单会关闭,之后我将光标放在同一窗口上的按钮上,但按钮悬停样式(例如鼠标-指针=光标)不起作用
  • 可以始终链接到该菜单/菜单项集合的 LostFocus 并在后面的代码中关闭它,或者类似的效果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 2011-05-25
  • 1970-01-01
  • 2022-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多