IsManipulationEnabled=true可防止触摸切换切换按钮
本文关键字:按钮 触摸 可防止 true IsManipulationEnabled | 更新日期: 2023-09-27 18:22:02
我正在寻找一种解决方案,使触摸能够在IsManipulationEnabled=true时处理切换按钮的切换。由于底层的3d地图,我不得不继续使用IsManipulationEnabled。
这是我一直在使用的测试项目。
<Window x:Class="TestingEventManager.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" IsManipulationEnabled="True">
<StackPanel HorizontalAlignment="Stretch">
<ToggleButton Height="40">
<ToggleButton.Style>
<Style TargetType="ToggleButton">
<Setter Property="Content" Value="OFF"/>
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Content" Value="ON"/>
</Trigger>
</Style.Triggers>
</Style>
</ToggleButton.Style>
</ToggleButton>
<ComboBox SelectedIndex="0" Height="40">
<ComboBoxItem>Test 1</ComboBoxItem>
<ComboBoxItem>Test 2</ComboBoxItem>
</ComboBox>
</StackPanel>
我已经考虑过在app.xaml样式中设置它,但仅为togglebutton设置它似乎不会向下扩展到combobox样式,而且它可以很容易地被另一个样式覆盖。
我也不想创建自定义类,因为这样每个人都需要记住使用这个派生类。
下面是一篇msdn博客文章,描述了混合触摸的一些问题MSDN博客文章
这是一篇文章,有人有类似的问题,但她只是延长了按钮。MSDN社交文章
昨晚我提出了一个解决方案,我将在代码中使用它。这不是最好的解决方案,因为它总是为每个切换按钮启用ManipulationEnabled,并且现在手动处理IsChecked,但它是我唯一能想到的始终操作每个切换按钮的方法。
private void EnableTouchDownTogglingOfToggleButton()
{
EventManager.RegisterClassHandler( typeof( ToggleButton ), ToggleButton.LoadedEvent, new RoutedEventHandler( TurnOnManipulaitonEnabled ) );
EventManager.RegisterClassHandler( typeof( ToggleButton ), ToggleButton.TouchDownEvent, new RoutedEventHandler( EnableTouchDownTogglingHandler ) );
}
private void TurnOnManipulaitonEnabled( object sender, RoutedEventArgs e )
{
// need to make sure all toggle buttons behave the same so we always assume IsManipulationEnabled is true
// otherwise it can open then close right after due to it firing again from mousedown being able to go through
ToggleButton toggle = sender as ToggleButton;
if ( toggle != null )
toggle.IsManipulationEnabled = true;
}
private void EnableTouchDownTogglingHandler( object sender, RoutedEventArgs e )
{
ToggleButton toggle = sender as ToggleButton;
if ( toggle != null )
toggle.IsChecked ^= true;
}