Question

Je l'ai défini un DataGrid comme celui-ci ::

 <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 aussi en-tête pour un certain état . (je ne veux pas utiliser DataGridHeaderStyle en raison d'autres problèmes que je ne veux pas expliquer ici.)

Je l'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 ceci ::

    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)
        {
            //some condition here which says whether contextmenu is required on this header

            (depObj as DataGridColumnHeader).ContextMenu = null;
            //the above line is not working!!!!
        }
        else
        {
             (depObj as DataGridCell).ContextMenu = null;
              //the above line not working!!!!
         }
    }

Je veux savoir où je vais mal !! S'il vous plaît aidez-moi à ce sujet. me guider également à faire une meilleure façon si je réalisais mon exigence dans un mauvais sens:)

Était-ce utile?

La solution

Hey je l'ai résolu :: Mon code modifié comme suit :::

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
     }
}

Autres conseils

Je pense que cette version est beaucoup plus rapide et vous ne devez pas définir la visibilité du menu contextuel. Il suffit d'annuler l'événement click si le clic est sur l'en-tête de 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;
    }
}

Je RichTextBox en 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

    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

Sorry. First attemt was not so good.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top