3

WPF4.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

4 に答える 4

2

この質問に対する私の回答を参照してください:タッチ インターフェイスの ScrollViewer が正しく機能しない

カスタム Thumb コントロールを使用して、アプリでもこの問題を解決しました。私の回答では、問題の原因を説明しています。

于 2012-01-20T19:15:18.867 に答える
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>
于 2010-12-13T16:03:17.240 に答える
0

これは、「処理済みとしてマークされたルーティング イベント」の場合のように聞こえます。AddHandler を使用してそのイベントをサブスクライブし、最後のパラメーター「handledEventsToo」を true に設定してみてください。

乾杯、ローラン

于 2010-07-15T18:45:01.027 に答える
0

ほとんどの場合、TouchMove イベントを処理しています。Slider コントロールで処理できるバブリング イベント (PreviewTouchMove など) があります。タッチ イベントの処理方法を調整する必要があります。

于 2010-07-15T18:45:54.813 に答える