2016-11-17 13 views
0

Ich habe ein Menü und ein Untermenü in WPF-Anwendung, wenn Mauszeiger aus Untermenüelement entfernen, verlor die Anwendung den Fokus. Zum Beispiel, Button Hover funktioniert nicht richtig. Aber wenn ich auf einen leeren Bereich der Anwendung klicke, funktioniert der Button-Hover-Effekt richtig.WPF-Anwendung verliert den Fokus, wenn das Untermenü geschlossen wird

Erwartete Verhalten ist, dass Button sollte nicht seinen Stil/Aktion verlieren.

enter image description here

Hover-Effekt: enter image description here

ohne Hover-Effekt: enter image description here

Steuervorlage als

<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> 
+0

Verwenden Sie ein Framework für die Benutzeroberfläche oder nur natives WPF? – dymanoid

+0

Ich benutze rohe WPF –

Antwort

0

folgen Wenn ich Sie recht verstehe, Sie bedeuten nicht, Die Anwendung verliert den Fokus (wie es nicht, die Sie sehen können, wenn yo Du drückst e. G. TAB), aber nichts als das geöffnete Untermenü und das entsprechende Hauptmenü reagiert auf die Maus.

Dies ist das Standardverhalten in WPF-Anwendungen, wenn ein Popup geöffnet wird. Das gleiche gilt für das Öffnen eines Kontextmenüs. In WinForms-Anwendungen ist es genauso.

Sie können dies auch in Visual Studio überprüfen.

EDIT

So haben wir eine App mainmenue

enter image description here

Wenn Sie eine menueitem klicken und die Maus bewegen (keine Taste gedrückt) über das Submenü Sie diese bekommen

enter image description here

und nach dem Umzug (st ill keine Taste gedrückt, bewegt nur) den ganzen Weg nach unten unter dem Untermenü

enter image description here

das Untermenü schließt? Wenn das stimmt, sollten Sie sich die Menüdefinition ansehen (und vielleicht hier posten), da dies kein Standardmenüverhalten ist.

+0

mein Anliegen ist, dass, wenn ich ein Untermenü öffnen und bewegen Cursor aus Untermenü Element, das Untermenü wird geschlossen, danach Cursor auf eine Schaltfläche auf demselben Fenster, aber Schaltfläche Hover Styling (zB Mauszeiger = cursor) funktioniert nicht –

+0

Bitte beachten Sie den bearbeiteten Abschnitt meines Beitrags –

+0

Konnte immer mit dem LostFocus für diese Menü-/Menüeintragsammlung verknüpfen und es im Code dahinter schließen, oder etwas in diesem Sinne – maximdumont

Verwandte Themen