我们遇到使用ComboBox
触摸事件和IsManipulationEnabled
属性设置为true
的控件的问题。
这是一个简单的例子,说明了它:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<ComboBox Grid.Row="0">
<ComboBoxItem Content="Item 1"/>
<ComboBoxItem Content="Item 2"/>
<ComboBoxItem Content="Item 3"/>
</ComboBox>
<Border Grid.Row="1"
IsManipulationEnabled="True"
Background="Red"/>
</Grid>
</Window>
如果您点击ComboBox
,则ComboBox
&#39; Popup
会打开。然后,如果您点击红色Border
(仅触摸平板电脑),则Popup
不会关闭。如果您使用手写笔或鼠标点击红色Border
,则Popup
会关闭。
使用Snoop,当Popup
打开并点击红色Border
时,您会看到以下行为:
使用触摸和IsManipulationEnabled="True"
:
PreviewTouchDown on MainWindow (Handled = false)
TouchDown on Border (Handled = false)
PreviewTouchUp on MainWindow (Handled = false)
TouchUp on Border (Handled = false)
使用触摸和IsManipulationEnabled="False"
:
PreviewTouchDown on MainWindow (Handled = false)
TouchDown on Border (Handled = false)
PreviewMouseDown on MainWindow (Handled = false)
MouseDown on ComboBox (Handled = true)
PreviewTouchUp on MainWindow (Handled = false)
TouchUp on Border (Handled = false)
MouseUp on Border (Handled = false)
我了解将IsManipulationEnabled
设置为true
意味着不再引发鼠标事件,ComboBox
无法捕获它们,并且当Popup
无法关闭时TouchDown
{1}}事件被提出。
所以我的问题是,是否有一个干净的解决办法迫使ComboBox
在失去焦点时关闭?
我知道我可以抓住边框的TouchDown
事件来明确关闭Popup
,但我正在寻找一个通用的解决方案,其中ComboBox
和控件不在&# 39;彼此了解(比如重写ComboBox
或控件,创建Behavior
,附加财产等。)