2009-12-10 5 views
1

Je scénario simple dans lequel je cache et montre une signle MenuItem dans un ContextMenu comme indiqué ci-dessous:WPF étrange question la visibilité MenuItem

Xaml:

<Window x:Class="Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Window1" Height="300" Width="300"> 
    <Window.ContextMenu> 
     <ContextMenu Name="mainMnu"> 
      <MenuItem Name="mnu" Header="Testing"/> 
     </ContextMenu> 
    </Window.ContextMenu> 

    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
     <Button HorizontalAlignment="Left" Margin="52,131,0,108" Name="Button1" 
       Width="75">Button</Button> 
    </Grid> 
</Window> 
Code

derrière:

Private Sub Button1_Click(ByVal sender As System.Object, 
          ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click 
    If mnu.Visibility = Windows.Visibility.Visible Then 
     mnu.Visibility = Windows.Visibility.Collapsed 
     mainMnu.Visibility = Windows.Visibility.Collapsed 
    Else 
     mnu.Visibility = Windows.Visibility.Visible 
     mainMnu.Visibility = Windows.Visibility.Visible 
    End If 

End Sub 

Le problème est que toutes les autres fois que j'appuie sur Button le MenuItem n'est pas montré. Clic droit affiche seulement un petit rectangle vide. (comme il y a un menu visible, mais pas un MenuItem visible). Il fonctionne en quelque sorte dans un cycle ... 2 premiers clics: problème, 2 clics ok, et ainsi de suite ...

Des idées?

Répondre

3

Si vous essayez de désactiver le menu contextuel, le réglage de Visibility est la mauvaise façon de le faire. Au lieu de cela, vous devez définir la propriété ContextMenu sur Nothing.

Par exemple:

If ContextMenu Is Nothing Then 
    ContextMenu = mainMnu 
Else 
    ContextMenu = Nothing 
End If 
+0

Cela fonctionne très bien pour mon exemple ... Mais je me demande encore s'il y a un moyen pour un ContextMenu pas tirer du tout si elle ne marche pas avoir des menuitems visibles ci-joints. – Entrodus

+0

Puisque vous avez le contrôle sur vos menuitems via codebehind, pouvez-vous utiliser le paramètre de leur visibilité pour désactiver ou activer le menu contextuel? c'est-à-dire lorsque vous créez votre fenêtre, définissez-la sur null, et lorsque vous rendez visible un menuitem, définissez-le sur mainMnu? Le problème évident ici est que vous pouvez dynamiquement rendre les choses visibles ou invisibles, et donc vous devrez le suivre. Je cherchais à voir si le ContextMenu apparaît via un événement. J'espérais que vous pourriez gérer l'événement de tunnel en vérifiant la visibilité de menuitem enfant, puis mettre l'envent à Handled, mais est venu court. – Dave