하나의 버그를 발견했는데, 왜 그런 일이 벌어지는 지 이해할 수 없습니다. 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
: 나쁜 일이 셀을 한 번의 클릭을 발생
전에
이 같았다
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();
}
}
}
}
이 버그를 재현하려면 단지 다른 세포에 빠르게 클릭
스타일'DefaultContextMenuStyle'에 대한 코드를 게시하십시오. –
@Massimil iano Kraus, 배경색은 –
입니다 [최소, 완료 및 검증 가능한 예제] (http://stackoverflow.com/help/mcve)를 만드십시오. –