【发布时间】:2015-02-16 08:49:19
【问题描述】:
我有一个 DataGridControl,它的单元格的 DataTemplate 覆盖到 TextBoxs,通过单击单元格外部但仍在 DataGrid 上,我希望 TextBox 失去键盘焦点,以便它可以提交更改,但似乎 DataGrid 不会t 处理 MouseLeftButtonDown 事件,所以我必须手动向 Grid 添加一个处理程序,并在处理程序中:
e.Handled = true;
Keyboard.Focus( sender as UIElement );
使父面板“可聚焦”。
通过使用 Snoop,我注意到像 TextBox、Button 这样的控件能够处理 MosueLeftButtonDown 事件,而 Panels 则不能,如果将“Focusable”属性设置为“True”。有谁知道这背后的原因,谢谢。
为了简化情况:假设我们在 Grid 上有一个 TextBox 和一个 Button:
<Grid Background="AliceBlue">
<TextBox Height="25" Margin="50" Text="abcd"/>
<Button Height="25" Margin="50,100,50,0"></Button>
</Grid>
当我点击 TextBox 时,它会获得 KeyBoard 焦点,当我点击 Grid 的空白区域时,我希望 TextBox 失去焦点,问题是 Grid 与 TextBoxes 和 Buttons 相比无法获得焦点。
【问题讨论】:
-
WPF 的事件系统相当通用。从 UIElement 派生的任何东西都能够处理鼠标/键盘和其他类型的事件。您无法“收听”面板上的事件背后的原因可能是因为默认情况下“没有任何颜色”的视觉效果(即空背景左右)不处理事件。请注意,透明颜色确实可以处理事件:这是在不影响视觉结果的情况下捕获事件的一种非常常见的方式。
-
谢谢马里奥,这里的问题不是容器Panel无法监听鼠标事件,而是默认无法获取键盘焦点响应MouseDown事件,键盘焦点仍然在DatagridCell中的Texbox .
标签: wpf routed-events