【问题标题】:Multi-touch ScrollViewer eating touch events多点触控 ScrollViewer 吃触控事件
【发布时间】:2011-03-16 13:57:04
【问题描述】:

WPF 4.0:

我有滚动查看器,里面有很多滑块。我希望滚动查看器可以通过触摸进行平移,并且我希望内部滑块也可以响应触摸。

不幸的是,滚动查看器正在吃“TouchMove”事件,而不是将它们传递给滑块控件。知道如何解决这个问题吗?

这是我的 XAML:

<Window x:Class="ScrollingTest.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">
    <Grid>
        <ItemsControl ItemsSource="{Binding}">
            <ItemsControl.Template>
                <ControlTemplate>
                    <ScrollViewer VerticalScrollBarVisibility="Auto" PanningMode="Both" >
                        <ItemsPresenter />
                    </ScrollViewer>
                </ControlTemplate>
            </ItemsControl.Template>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Border Height="100" BorderThickness="2" BorderBrush="Black">
                        <Slider Value="{Binding ., Mode=TwoWay}" Width="300" Minimum="0" Maximum="100" />
                    </Border>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>
</Window>

还有我的代码隐藏:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = Items;
    }

    public IEnumerable<int> Items
    {
        get
        {
            return Enumerable.Range(0, 50);
        }
    }
}

【问题讨论】:

    标签: wpf scroll multi-touch


    【解决方案1】:

    请看我对这个问题的回答:ScrollViewer in a touch interface not working properly

    我刚刚在我们的应用程序中也使用自定义 Thumb 控件解决了这个问题 - 在我的回答中,我解释了导致问题的原因。

    【讨论】:

      【解决方案2】:

      这听起来像是“标记为已处理的路由事件”的情况。可以尝试使用 AddHandler 订阅该事件,并将最后一个参数“handledEventsToo”设置为 true 吗?

      干杯, 洛朗

      【讨论】:

      • 好建议,劳伦特。我试过了,但我仍然没有得到 TouchMove 事件。我也尝试过覆盖 OnTouchMove ......但它从未在基础中将“Handled”设置为 true...... blerg。
      • 我是触摸手势方面的新手;一旦你有一个 TouchDown 事件,你是否必须注册一个事件处理程序?或者系统是否依赖某些硬件来触发您可能没有的 TouchMove?只是猜测。
      • 当滑块不在滚动查看器中时,一切正常,因为触摸事件被转换为鼠标事件。我什至可以在没有滚动查看器的情况下获得 TouchMove 事件。但是,一旦滚动查看器接管,它就不会让 TouchMove 事件停止,因此它永远没有机会被翻译为鼠标移动。
      【解决方案3】:

      它很可能正在处理 TouchMove 事件。您可以在 Slider 控件中处理冒泡事件(PreviewTouchMove 等)。您需要协调处理触摸事件的方式。

      【讨论】:

      • 据我所知,PreviewTouchMove 或 TouchMove 的“已处理”标志永远不会设置为 True。尽管如此,这些事件永远不会进入滑块。然而,TouchDown 确实做到了。发生这种情况时我已经尝试过 CaptureTouch ......但仍然没有运气:(
      【解决方案4】:

      您可以尝试制作您的自定义类,从 ScrollViewer 派生并覆盖 OnTouchMove 方法。

      public class CustomScrollViewer : System.Windows.Controls.ScrollViewer
      {
          protected override void OnTouchMove(System.Windows.Input.TouchEventArgs e)
          {
              // delete the base.OnTouchMove() call to prevent event being "eat" :)
          }
      }
      

      然后,您像这样编辑 xaml:

      <Window x:Class="ScrollingTest.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">
          <Grid>
              <ItemsControl ItemsSource="{Binding}">
                  <ItemsControl.Template>
                      <ControlTemplate>
                          <local:CustomScrollViewer VerticalScrollBarVisibility="Auto" PanningMode="Both" >
                              <ItemsPresenter />
                          </local:CustomScrollViewer>
                      </ControlTemplate>
                  </ItemsControl.Template>
                  <ItemsControl.ItemTemplate>
                      <DataTemplate>
                          <Border Height="100" BorderThickness="2" BorderBrush="Black">
                              <Slider Value="{Binding ., Mode=TwoWay}" Width="300" Minimum="0" Maximum="100" />
                          </Border>
                      </DataTemplate>
                  </ItemsControl.ItemTemplate>
              </ItemsControl>
          </Grid>
      </Window>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-13
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多