在ScrollViewer
中DataTemplate
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应用程序的解决方案,这不会改变正常的滚动行为。
答案 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>