Мультитач ScrollViewer есть сенсорные события - PullRequest
3 голосов
/ 15 июля 2010

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);
        }
    }
}

Ответы [ 4 ]

2 голосов
/ 20 января 2012

Пожалуйста, посмотрите мой ответ на этот вопрос: ScrollViewer в сенсорном интерфейсе не работает должным образом

Я только что решил эту проблему в нашем приложении, используя собственный элемент управления Thumb - в моем ответеЯ объясняю, в чем причина проблемы.

0 голосов
/ 15 июля 2010

Скорее всего, он обрабатывает событие TouchMove.Существуют пузырьковые события (PreviewTouchMove и т. Д.), Которые вы можете обработать в элементе управления Slider.Вам необходимо согласовать способ обработки событий касания.

0 голосов
/ 13 декабря 2010

Вы можете попытаться создать свой собственный класс, производный от 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>
0 голосов
/ 15 июля 2010

Это звучит как случай "перенаправленного события, помеченного как обработанное". Можете ли вы попытаться использовать AddHandler для подписки на это событие и установить для последнего параметра "handledEventsToo" значение true?

Ура, Laurent

...