IsManipulationEnabled = true可防止触摸关闭ComboBox

时间:2015-10-09 16:50:28

标签: .net wpf combobox popup touch

我们遇到使用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,附加财产等。)

0 个答案:

没有答案