【发布时间】:2020-09-16 15:56:51
【问题描述】:
我在这里没有使用任何外部库,只是普通的 WPF。
我有一个带有自定义 DataGridColumnHeader 的 DataGrid。此列标题包含一个用于切换 Popup 的 ToggleButton。在弹出窗口中有一个文本框。我遇到的问题是在 TextBox 内双击会引发 DataGrid 上的 MouseDoubleClick 事件。这是一个包含编号 cmets 的简化版本,我稍后会参考
<Window x:Class="PopupsAreWeird.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:PopupsAreWeird" xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="DataGridColumnHeader">
<!-- 1) This eventhandler is never called -->
<Grid Control.MouseDoubleClick="Grid_MouseDoubleClick_1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ContentPresenter Grid.Column="0" />
<ToggleButton x:Name="openToggle" Grid.Column="1" Content="Open" />
<Popup IsOpen="{Binding ElementName=openToggle, Path=IsChecked}" StaysOpen="True">
<!-- 2) This eventhandler is always called, and the problem I am having is there regardless of whether I set e.Handled = true in this handler or not -->
<TextBox Width="200" MouseDoubleClick="TextBox_MouseDoubleClick" />
</Popup>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<StackPanel Orientation="Vertical">
<!-- 3) This eventhandler is always called, but never should be -->
<DataGrid MouseDoubleClick="DataGrid_MouseDoubleClick">
<DataGrid.Columns>
<DataGridTextColumn Header="Header 1" Width="200" />
</DataGrid.Columns>
</DataGrid>
</StackPanel>
</Window>
1) 我不明白为什么这个处理程序永远不会被调用。这意味着将 e.Handled 设置为 true 以停止向上冒泡到 DataGrid。虽然 Grid 没有 MouseDoubleClick 的定义,但据我了解,我可以将任何事件的事件处理程序附加到任何元素(例如将 ButtonBase.Click 附加到 Panel 元素)。这不是真的,还是我遗漏了什么特殊情况?
3) 我想避免双击事件冒泡到这里,但是即使我在事件处理程序 2 中将 e.Handled 设置为 true,也会调用该事件处理程序,并且在该处理程序中,e.Handled 是错误的。我认为原因是 Popup 是在 DataGridColumnHeader 内部定义的,并且由于某种奇怪的原因引发了 2 个事件,一个用于弹出窗口的树,一个用于包含 Popup 元素的树,但这似乎有点荒谬.
我知道 Popup 在 WPF 中是一种奇怪的东西,但这似乎我错过了一些明显的东西。有什么方法可以实现我想要的,即没有事件(或至少 MouseDoubleClick 事件)冒泡到 DataGrid?
提前致谢, 大卫
【问题讨论】:
标签: c# wpf datagrid wpf-controls