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);
}
}
}
答案 0 :(得分:2)
请参阅我对此问题的回答:ScrollViewer in a touch interface not working properly
我刚刚在我们的应用程序中使用自定义Thumb控件解决了这个问题 - 在我的回答中,我解释了导致问题的原因。
答案 1 :(得分:0)
这听起来像是“标记为已处理的路由事件”。您是否可以尝试使用AddHandler订阅该事件,并将最后一个参数“processedEventsToo”设置为true?
干杯, 劳伦
答案 2 :(得分:0)
它最有可能处理TouchMove事件。您可以在Slider控件中处理冒泡事件(PreviewTouchMove等)。您需要协调您希望如何处理触摸事件。
答案 3 :(得分:0)
您可以尝试创建自定义类,派生自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>