본문 바로가기

[C#] WPF GridControl 공부 #1 GridControl의 ContextMenu Custom

I'm 영서 2024. 2. 28.
반응형

 

GridControl에서 가끔씩 마우스 오른쪽 클릭을 햇을때 ContextMenu를 구분해서 사용해야 하는 경우가 있다.

 

나같은 경우 GridControl의 Column을 ViewModel을 사용하여 가변적으로 사용해야 하는데, 이를 위해 Sample 프로그램을 만든 과정을 기록한다.

 

라이브러리는 DevExpress를 사용하였다.

 

먼저 GridControl을 생성하고 두개의 ContextMenu를 생성해주었다.

 

        <dxg:GridControl x:Name="gridControl" Width="1000">
            <dxg:GridControl.Resources>
                <ContextMenu x:Name="GridRowContextMenu" x:Key="GridRowContext">
                    <MenuItem x:Name="ContextAddBrunch" Header="Add Brunch"/>
                    <MenuItem x:Name="ContextDeleteBrunch" Header="Delete Brunch"/>
                    <!-- Add more menu items as needed -->
                </ContextMenu>
                <ContextMenu x:Name="GridColumnContext" x:Key="GridColumnContext">
                    <MenuItem x:Name="ContextAddColumn" Header="Add Column" Click="ContextAddColumn_Click"/>
                    <MenuItem x:Name="ContextDeleteColumn" Header="Delete Column" Click="ContextDeleteColumn_Click"/>
                    <!-- Add more menu items as needed -->
                </ContextMenu>
            </dxg:GridControl.Resources>
            <dxg:GridControl.View>
                <dxg:TableView ShowGroupPanel="False" AutoWidth="True" PrintAutoWidth="True" MouseRightButtonDown="Sample_MouseRightButtonDown"  />
            </dxg:GridControl.View>
        </dxg:GridControl>

 

 

여기서 문제는 GridControl에서 어디를 선택했는지를 알아야 한다는것이다. 

TableView의 Sample_MouseRightButtonDown 이벤트를 생성했는데,

코드비하인드에서 작업을 해주었다. 

 

TableView 안의 CalcHitInfo가 어디를 클릭했는지를 리턴하는데, e.GetPosition(view)를 통해 현재 View에서 e의 포지션을 계산해서 가져와준다. 

 

그리곤 위치에 따라 해당하는 ContextMenu를 열어주면 된다!

 

private void Sample_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    TableView view = sender as TableView;

    TableViewHitInfo info = view.CalcHitInfo(e.GetPosition(view));

    if(info.InColumnHeader || info.InColumnPanel)
    {
        ContextMenu contextMenu = gridControl.Resources["GridColumnContext"] as ContextMenu; 

        if (contextMenu != null)
        {
            contextMenu.IsOpen = true;
        }
    }
    else if (info.IsDataArea )
    {
        // 셀에서 우클릭되었음을 확인합니다.
        ContextMenu contextMenu = gridControl.Resources["GridRowContext"] as ContextMenu;
        if (contextMenu != null)
        {
            contextMenu.IsOpen = true;
        }
    }
}
반응형

댓글