1

慣性スクロールやその他のタッチ機能を使用できるように、マウス イベントをタッチ イベントに変換するアプリケーションがあります。そのコードは、ここで選択された回答にあります:

WPF: Windows 7 で通常のマウス イベントをタッチ イベントに「ルーティング」する可能性はありますか

私が抱えている問題は、ListBoxフリックスクロール中にアイテムを選択することです。ListBox通常、タッチ デバイスはスクロール中に項目を選択しません。ここで何が欠けていますか?

私が使用している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="600" Width="525">
    <Grid>
        <ListBox x:Name="testListBox"               
                 VirtualizingPanel.ScrollUnit="Pixel" 
                 SelectionMode="Single">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Border CornerRadius="3" Height="60" Width="480" Background="LightGray" Margin="1">
                        <Label Content="{Binding}"/>
                    </Border>
                </DataTemplate>
            </ListBox.ItemTemplate>               
        </ListBox>
    </Grid>
</Window>

コードビハインド:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        MouseTouchDevice.RegisterEvents(this);

        for (int i = 0; i < 300; i++)
        {
            testListBox.Items.Add("test " + i.ToString());
        }
    }       
}
4

3 に答える 3

0

これはAdornersを使用して達成できると思います。

MSDNサンプル http://msdn.microsoft.com/en-us/library/ms771585(VS.85).aspx

装飾者はとてもシンプルです。ここでは非常によく使用できます。以下のリンクを参照してください。オーバーレイが好ましくない場合は、装飾レイヤーの背景を透明にすることができます。

http://www.codeproject.com/Articles/57984/WPF-Loading-Wait-Adorner

于 2013-02-23T03:03:30.910 に答える
0

これを行うために私が見つけた唯一の方法は、プロパティをfalseDataTriggerに設定するためにを使用することでした。ListBoxItem Focusable私の場合IsScrolling、ユーザーがスクロールをフリックするとプロパティをfalseに設定し、ケニティックムーブメントが停止すると元に戻ります。これにより、リストをフリックしている間、選択動作が停止します。

このソリューションはシナリオでは機能しない可能性がありますが、作業に適応できる可能性があるため、ここに実際の例を示します。

Xaml:

<Window x:Class="WpfApplication13.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Name="UI">
    <Grid DataContext="{Binding ElementName=UI}">
        <ListBox Margin="0,32,0,0" ItemsSource="{Binding List}" ScrollViewer.ScrollChanged="List_ScrollChanged">
            <ListBox.ItemContainerStyle>
                <Style TargetType="{x:Type ListBoxItem}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsScrolling, ElementName=UI}" Value="True">
                            <Setter Property="IsHitTestVisible" Value="False"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ListBox.ItemContainerStyle>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Button Content="{Binding}" />
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>

コード:

public partial class MainWindow : Window, INotifyPropertyChanged
{

    private ObservableCollection<string> myVar = new ObservableCollection<string>();
    private DateTime _lastScroll;

    public MainWindow()
    {
        InitializeComponent();
        MouseTouchDevice.RegisterEvents(this);
        for (int i = 0; i < 1000; i++)
        {
            List.Add("StackOverflow " + i);
        }
    }

    public ObservableCollection<string> List
    {
        get { return myVar; }
        set { myVar = value; }
    }

    public bool IsScrolling
    {
        get { return !(DateTime.Now > _lastScroll.AddMilliseconds(100)); }
    }

    private void List_ScrollChanged(object sender, ScrollChangedEventArgs e)
    {
        _lastScroll = DateTime.Now;
        ThreadPool.QueueUserWorkItem((o) =>
        {
            Thread.Sleep(100);
            NotifyPropertyChanged("IsScrolling");
        });
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}
于 2013-01-06T20:25:17.733 に答える