2010-10-28 6 views
0

J'ai défini un DataGrid comme celui-ci ::
menu contextuel Désactiver sur certaines cellules DatGrid WPF

<cc:PEDataGrid AutoGenerateColumns="False" 
       ItemsSource="{Binding Rows}" 
       Width="Auto"     
       PreviewMouseRightButtonDown="PEGrid_PreviewMouseRightButtonDown" 
       Loaded="CommonPEGrid_Loaded">    
     <wpfkit:DataGrid.ContextMenu> 
     <ContextMenu> 
      <MenuItem Header="Cut" /> 
      <MenuItem Header="Copy"/> 
      <MenuItem Header="Paste"/>    
     </ContextMenu> 
    </wpfkit:DataGrid.ContextMenu> 
</cc:PEDataGrid> 

Cela montre contextMenu sur chaque cellule quand un clic droit est fait.
Je veux désactiver le menu contextuel pour toutes les cellules sauf les en-têtes et également sur l'en-tête pour certaines conditions. (je ne veux pas utiliser DataGridHeaderStyle en raison d'autres problèmes que je ne veux pas expliquer ici.)

J'ai défini un gestionnaire pour PreviewMouseRightButtonDown sur la grille de données et dans le gestionnaire que je suis en train de faire quelque chose comme Je veux savoir où je me trompe !! S'il vous plaît aidez-moi à ce sujet. guider aussi me faire une meilleure façon si je réalisais mon exigence dans un mauvais sens :)

Répondre

1

Hey je l'ai résolu :: Mon code modifié est la suivante :::

private void PEGrid_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    DependencyObject depObj = (DependencyObject)e.OriginalSource; 

    while ((depObj != null) && !(depObj is DataGridColumnHeader)) 
    { 
     depObj = VisualTreeHelper.GetParent(depObj); 
    } 

    if (depObj == null) 
    { 
     return; 
    } 

    if (depObj is DataGridColumnHeader) 
    { 
      dg.ContextMenu.Visibility = Visibility.Visible; //works 
    } 
    else 
    { 
      dg.ContextMenu.Visibility = Visibility.Collapsed; //works 
    } 
} 
+0

J'ai utilisé cette réponse comme base pour l'arrêt du menu contextuel affiché sur les en-têtes. Merci d'avoir posté votre solution de fonctionnement finale. – coffeecoder

+0

qu'est-ce que dg ici .. et comment pouvons-nous appeler cet événement n'importe où .. – Silver

1

Je pense cette version est beaucoup plus rapide et vous n'avez pas besoin de définir la visibilité du menu contextuel. Il suffit d'annuler l'événement click si le clic était sur l'en-tête de la colonne.

private void PEGrid_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    var depObj = (DependencyObject)e.OriginalSource; 
    while ((depObj != null) && !(depObj is DataGridColumnHeader)) 
    { 
     depObj = VisualTreeHelper.GetParent(depObj); 
    } 
    if (depObj is DataGridColumnHeader) 
    { 
     e.Handled = true; 
    } 
} 
+0

La seule version ici qui fonctionne pour moi si j'utilise ce code dans l'événement OnMouseRIghtButtonUp. – KCT

0

J'ai RichTextBox dans DataGridCell qui n'est pas l'élément VisualTree. Mon code:

private void dgLog_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     FrameworkContentElement fce = e.OriginalSource as FrameworkContentElement; 
     DependencyObject depObj = e.OriginalSource as DependencyObject; 
     DataGridCell dgc = null; 
     DataGridRow dgr = null; 
     try 
     { 
      while (fce != null && !(fce is DataGridCell)) 
      { 
       depObj = fce.Parent; 
       fce = depObj as FrameworkContentElement; 
      } 
      while (depObj != null && !(depObj is DataGridRow)) 
      { 
       if (depObj is DataGridCell) 
        dgc = depObj as DataGridCell; 
       depObj = VisualTreeHelper.GetParent(depObj); 
      } 
      if (depObj == null) 
       return; 
      dgr = depObj as DataGridRow; 
      if (((LogRecord)dgr.Item).SourceType == "FileMessage" && dgc.Column.DisplayIndex == 1) 
       dgLog.ContextMenu = cm_dgLog; 
      else 
       dgLog.ContextMenu = null; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(...); 
      TraceHelper.TraceError(ex, GetType()); 
     } 
    }//private void dgLog_PreviewMouseRightButtonDown 

LogRecord est le type de DataGridColumn.Item

-1
private void dgLog_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     FrameworkContentElement fce = e.OriginalSource as FrameworkContentElement; 
     DependencyObject depObj = e.OriginalSource as DependencyObject; 
     DataGridCell dgc = null; 
     DataGridRow dgr = null; 
     try 
     { 
      while (fce != null && !(fce is DataGridCell)) 
      { 
       depObj = fce.Parent; 
       fce = depObj as FrameworkContentElement; 
      } 
      while (depObj != null && !(depObj is DataGridRow)) 
      { 
       if (depObj is DataGridCell) 
        dgc = depObj as DataGridCell; 
       depObj = VisualTreeHelper.GetParent(depObj); 
      } 
      if (depObj == null) 
       return; 
      dgr = depObj as DataGridRow; 
      if (((LogRecord)dgr.Item).SourceType == "FileMessage" && dgc.Column.DisplayIndex == 1) 
       dgLog.ContextMenu = cm_dgLog; 
      else 
       dgLog.ContextMenu = null; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(...); 
      TraceHelper.TraceError(ex, GetType()); 
     } 
    }//private void dgLog_PreviewMouseRightButtonDown 

Désolé. Le premier attemt n'était pas si bon.

Questions connexes