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社交文章

IsManipulationEnabled=true可防止触摸切换切换按钮

昨晚我提出了一个解决方案,我将在代码中使用它。这不是最好的解决方案,因为它总是为每个切换按钮启用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;
}