阻止ScrollViewer处理ListBox项中的Tap事件

时间:2013-12-14 21:41:28

标签: c# wpf xaml windows-phone-8 listbox

ScrollViewerDataTemplate ListBox会导致Tap event被处理,因此SelectedItem值不能被<ListBox ItemsSource="{Binding TheSource}" SelectedItem="{Binding TheSelected, Mode=TwoWay}"> <ListBox.ItemTemplate> <DataTemplate> <ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Disabled" > <StackPanel Width="100" Background="Black" Height="50" Margin="12"/> </ScrollViewer> </DataTemplate> </ListBox.ItemTemplate> </ListBox> 更改用户选择。

如何覆盖此行为?

例如,点击以下XAML中的StackPanel不会触发SelectedItem更改:

{{1}}

我正在寻找适用于WP8应用程序的解决方案,这不会改变正常的滚动行为。

1 个答案:

答案 0 :(得分:0)

WPF ScrollViewer在内部处理选择,因此e.handled = false不起作用。

虽然有一个简单的解决方案。您必须派生ScrollViewer类:

public class CustomScrollViewer : ScrollViewer
{
    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
    {
        // Do nothing!
           // or
       // base.OnMouseLeftButtonDown(e) ; e.handled = false; --to support selection //in the ScrollViewer .didn't try this one though!!
    }
}

将该类保存在项目中并使用它:

...
xmlns:test="clr-namespace:WpfApplication"
...

<ListBox ItemsSource="{Binding TheSource}" SelectedItem="{Binding TheSelected, Mode=TwoWay}">
<ListBox.ItemTemplate>
    <DataTemplate>
        <test:CustomScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Disabled"                                         >
            <StackPanel Width="100" Background="Black" Height="50" Margin="12"/>
        </test:CustomScrollViewer>
    </DataTemplate>
</ListBox.ItemTemplate>