2013-01-06 33 views
1

我有一個應用程序可以將鼠標事件轉換爲觸摸事件,以便我可以使用慣性滾動和其他觸摸功能。這代碼是在這裏所選擇的答案:防止滾動列表框時的選擇

WPF: Is there a possibility to "route" ordinary mouse events to touch events in 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()); 
     } 
    }  
} 

回答

0

的唯一途徑,我發現這是使用DataTrigger設置ListBoxItemFocusable屬性設置爲false做。在我來說,我的財產IsScrolling設置爲false,當用戶輕彈卷軸和回kenitic運動停止時,該停止selction行爲而輕彈雖然名單

這種解決方案可能無法在你的情況下工作,但這裏是一個工作例如,您可能能夠適應您的工作。

的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)); 
     } 
    } 
} 
+0

我認爲這是一個聰明的解決方案,但是它有一些問題。第一種情況是,如果項目模板包含按鈕,將容器樣式設置爲不可聚焦,則仍然允許點擊按鈕和命令。另一個問題是它不是很可重用,我有大約35個視圖模型需要實現這種行爲MVVM風格,這確實工作正常。 – Robert

+0

我已經更新了'ItemTemplates'上的答案,在這種情況下,我們將'IsHitTestVisible'設置爲false而不是'Focusable',現在我們只需要找到一個很好的方法來通知'IsScrolling',我會有一個遊戲並嘗試找到一個通用的方法來做到這一點。 –

+0

我用一個很好的例子更新了我的答案,它可能不是最迷人的解決方案,但我認爲它適用於您的情況(爲我的工作:)) –

0

我覺得這個可以用裝飾器來實現。

MSDN樣品 http://msdn.microsoft.com/en-us/library/ms771585(VS.85).aspx

裝飾器是非常簡單的;它在這裏可以很好地使用。 請參考下面的鏈接,如果疊加層不是首選的,您可以使adorner圖層背景變爲透明。

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

+0

這太過於籠統了。 – Robert

+0

@Robert感謝您的反饋,更新了一些更多細節。希望它有幫助。 – Liju

0

我知道這是一個老問題,但我有一個確定的解決方案。 設置ScrollViewer.PanningMode屬性可啓用觸摸滾動功能,從而防止在MouseUp上進行選擇。例如,設置爲PanningMode="VerticalOnly",對於簡單的滾動場景,您應該都很好。

希望我幫助別人