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

我发现这样做的唯一方法是使用 aDataTriggerListBoxItem Focusable属性设置为 false。在我的情况下IsScrolling,当用户轻弹滚动时,我将属性设置为 false 并在 kenitic 运动停止时返回,这会在轻弹列表时停止选择行为

此解决方案可能不适用于您的场景,但这是一个可行的示例,因为您可能能够适应为您工作。

xml:

<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 回答
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

我知道这是一个老问题,但我有一个确认的解决方案。设置该ScrollViewer.PanningMode属性可以启用触摸滚动,从而防止在MouseUp. 例如,只需设置PanningMode="VerticalOnly"一个简单的滚动场景,你应该一切都好。

希望我帮助了某人

于 2018-02-11T08:49:58.400 回答