2016-08-31 2 views
0

하나의 버그를 발견했는데, 왜 그런 일이 벌어지는 지 이해할 수 없습니다. DataGrid가 있습니다. 왼쪽 마우스 단추로 ContextMenu를 열려고합니다를 클릭하십시오. 내가 만들었습니다. 무작위로 DataGrid의 Cells를 클릭하기 전까지 (ContextMenu가 닫히고 새로운 장소에 다시 나타날 때까지) 잘 동작합니다. 그러나 한 순간에 뭔가 일이 일어나고 ContextMenu가 더 새롭게 표시됩니다 (그리고 창은 버튼을 클릭하는 것과 같은 모든 마우스 이벤트에 응답하지 않습니다) ... 커서를 창 밖으로 이동하고 반환 할 때까지 (또는 Alt 또는 F10을 클릭하여) . 여기모든 마우스 이벤트를 삼키는 WPF ContextMenu

일부 코드 : (<DataGrid.Resources> 내부)
의 ContextMenu

<ContextMenu Style="{StaticResource DefaultContextMenuStyle}" x:Key="cm" 
    DataContext="{Binding Data, Source={StaticResource WindowViewModel}}"> 
</ContextMenu> 

DataGrid 열의 :

<DataGridTemplateColumn Header="TestHeader" Width="*"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <DockPanel ContextMenu="{StaticResource cm}" VerticalAlignment="Stretch" Background="Transparent"> 
       <i:Interaction.Behaviors> 
        <local:OpenContextMenuLeftBehavior /> 
       </i:Interaction.Behaviors> 
       <TextBlock Style="{StaticResource TextVCenteredCellStyle}" Text="{Binding LPU}" /> 
      </DockPanel> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

그리고 행동의 ContextMenu를 열려면 :

public class OpenContextMenuLeftBehavior : Behavior<FrameworkElement> 
{ 
    protected override void OnAttached() 
    { 
     AssociatedObject.PreviewMouseUp += OpenContextMenu; 
    } 

    protected override void OnDetaching() 
    { 
     AssociatedObject.PreviewMouseUp -= OpenContextMenu; 
    } 

    void OpenContextMenu(object sender, MouseButtonEventArgs e) 
    { 
     if (e.ChangedButton == MouseButton.Left) { 
      FrameworkElement Sender = sender as FrameworkElement; 
      Sender.ContextMenu.PlacementTarget = Sender; 
      Sender.ContextMenu.IsOpen = true; 
     } 
    } 
} 

내가 그 버그를 발견했을 때 , 스눕과 함께 몇 가지 정보를 찾으려고 노력했습니다. WPF. 그것에서 그리고 여기에 몇 가지 정보 : 나쁜 일이 후
before bad thing

  • : 나쁜 일이 셀을 한 번의 클릭을 발생

    1. 전에

      이 같았다
      after bad thing
      첫 번째 이벤트 팝업에서 일어난 (의 ContextMenu 부분?), VisualTree 창에 속하지 않습니다. 이 팝업은 주 창과 닫는 곳에서 마우스를 움직일 때 전체적으로 늘어나는 것처럼 보입니다.

    그래서, 그 버그에 이일을 잃고 이것은 내가 찾을 수있는 모든 것입니다.
    도와주세요.

    편집 : 나는 최소한의 예제를 만들어 :

    XAML :

    <Window x:Class="WpfApplication1.MainWindow" 
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
         xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
         xmlns:local="clr-namespace:WpfApplication1" 
         Title="MainWindow" Height="350" Width="525"> 
        <Grid> 
         <DataGrid x:Name="dg1" IsReadOnly="True"> 
          <DataGrid.Columns> 
           <DataGridTemplateColumn Width="*"> 
            <DataGridTemplateColumn.CellTemplate> 
             <DataTemplate> 
              <DockPanel> 
               <i:Interaction.Behaviors> 
                <local:OpenContextMenuLeftBehavior /> 
               </i:Interaction.Behaviors> 
               <DockPanel.ContextMenu> 
                <ContextMenu> 
                 <MenuItem Header="123456"></MenuItem> 
                </ContextMenu> 
               </DockPanel.ContextMenu> 
               <TextBlock Text="123" /> 
              </DockPanel> 
             </DataTemplate> 
            </DataGridTemplateColumn.CellTemplate> 
           </DataGridTemplateColumn> 
          </DataGrid.Columns> 
         </DataGrid> 
        </Grid> 
    </Window> 
    

    코드 숨김

    public partial class MainWindow : Window 
    { 
        public MainWindow() 
        { 
         InitializeComponent(); 
         dg1.ItemsSource = new List<int>() 
         { 
          1,2,3,4,5,6,7,8,9,0 
         }; 
        } 
    } 
    
    public class OpenContextMenuLeftBehavior : Behavior<FrameworkElement> 
    { 
        protected override void OnAttached() 
        { 
         AssociatedObject.PreviewMouseUp += OpenContextMenu; 
        } 
    
        protected override void OnDetaching() 
        { 
         AssociatedObject.PreviewMouseUp -= OpenContextMenu; 
        } 
    
        void OpenContextMenu(object sender, MouseButtonEventArgs e) 
        { 
         if (e.ChangedButton == MouseButton.Left) { 
          FrameworkElement Sender = sender as FrameworkElement; 
          if (Sender != null) { 
           Sender.ContextMenu.PlacementTarget = Sender; 
           Sender.ContextMenu.IsOpen = true; 
           Sender.ContextMenu.UpdateLayout(); 
          } 
         } 
        } 
    } 
    

    이 버그를 재현하려면 단지 다른 세포에 빠르게 클릭

  • +1

    스타일'DefaultContextMenuStyle'에 대한 코드를 게시하십시오. –

    +0

    @Massimil iano Kraus, 배경색은 –

    +0

    입니다 [최소, 완료 및 검증 가능한 예제] (http://stackoverflow.com/help/mcve)를 만드십시오. –

    답변

    0

    개정

    는 전체, 간단한 예제를 발표 한 후, 나는 다음과 같은 좋을 것 답변 :

    private void ContextMenu_PreviewMouseUp(object sender, MouseButtonEventArgs e) 
        { 
         var Sender = (sender as ContextMenu); 
         if (Sender != null) 
         { 
          Sender.IsOpen = true; 
          e.Handled = true; 
         } 
        } 
    

    을 정의 갖는의 ContextMenu를

        Sender.ContextMenu.IsOpen = true; 
            Sender.ContextMenu.PreviewMouseUp += ContextMenu_PreviewMouseUp; 
    

    만든 후 을 (여전히에있다 격자 선 선택을 관리하십시오.) 여기에서 주제와 비슷합니다.

    +0

    아니요, 도움이되지 않습니다. –

    +0

    @FrantsevM Revised. 'UpdateLayout'도 함께 시도하십시오 –

    +0

    그리고 * 정말로 * 도움이되지 않는 것은 당신이 문제를 재현하기위한 완전한 예제와 명확하고 결정 론적 인 일련의 단계를 공유하지 않는다는 것입니다. –

    관련 문제