【问题标题】:LongListMultiSelector blocks gesture events for selected itemsLongListMultiSelector 阻止所选项目的手势事件
【发布时间】:2013-01-03 03:57:42
【问题描述】:

在以下 XAML 中,当在 LongListMultiSelector 中选择任何 TextBlock 时,TextBlock 将停止接收 Tap 事件(和任何其他手势事件),但当我再次点击它时,它会变为未选中状态。如何更改此行为,以使 TextBlock 始终响应 Tap 而不管其选择状态如何?

<toolkit:LongListMultiSelector ItemsSource="{Binding Items}">
    <toolkit:LongListMultiSelector.ItemTemplate>
        <DataTemplate>
            <!-- When TextBlock is selected, Debug_WriteLine_Tapped does not get called -->
            <TextBlock Text="{Binding name}" Tap="Debug_WriteLine_Tapped" />
        </DataTemplate>
    </toolkit:LongListMultiSelector.ItemTemplate>
</toolkit:LongListMultiSelector>

基本上我正在寻找的是一种类似于标准邮件应用程序的行为,在选择一堆字母后,他们仍然会收到 Tap 事件,因为我仍然可以展开/折叠其中任何一个(除了在我的情况下这是一个简单的TextBlocks 而不是ExpanderViews)。

【问题讨论】:

    标签: c# xaml events windows-phone-8


    【解决方案1】:

    在我的机器上工作正常。当我点击这 3 个项目时,我会在调试日志中收到预期的消息。

    <phone:LongListSelector ItemsSource="{Binding}">
        <phone:LongListSelector.ItemTemplate>
            <DataTemplate>
                <Grid >
                    <TextBlock Text="{Binding}" Tap="TextBlock_Tap_1" />
                </Grid>
            </DataTemplate>
        </phone:LongListSelector.ItemTemplate>
    </phone:LongListSelector>
    
    private void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        this.DataContext = "Foo Bar Baz".Split(' ');
    }
    
    private void TextBlock_Tap_1(object sender, GestureEventArgs e)
    {
        Debug.WriteLine("TextBlock_Tap_1");
    }
    

    根据您的场景 WP8 公开了可能有用的 UseOptimizedManipulationRouting 属性。设置 UseOptimizedManipulationRouting=false 会导致 LongListSelector、Pivo​​t 和其他控件不会吞下嵌套控件的事件。设置它的好地方是 LongListSelector.ItemTemplate 的根控件。

    【讨论】:

    • 刚刚尝试在LongListMultiSelector 上将UseOptimizedManipulationRouting 设置为false,但没有帮助。选定的文本块仍然未被选中,而不是响应 Tap。
    • 我对@9​​87654326@ 没有任何问题,因为那里无法选择项目。在LongListMultiSelector 中,当未选择项目时,它会按应有的方式响应点击,我会在控制台中看到输出。但是一旦它被选中,它的点击响应就会被取消选中,而不是触发它的事件监听器,这就是我想摆脱的行为。
    • 也许我用错了词,在“选定项目”下,我的意思是在LongListMultiSelector 前面有一个选中复选框的项目。
    【解决方案2】:

    工具包使用这个信号来响应点击。

    private void OnItemContentTap(object sender, System.Windows.Input.GestureEventArgs e)
    

    示例中定义了与 LongListMultiSelector 构造分开的数据模板

    <phone:PhoneApplicationPage.Resources>
    

    部分并将其引用为

    ItemTemplate="{StaticResource EmailItemTemplate}.
    

    有关示例,请参阅工具包中的 LongListMultiSelectorSample.xaml。该样本实际上是不完整的,起初可能会令人困惑。只需忽略 BuddiesPivotItem 和 GridModeItem,除非您想完成它并使整个事情正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      相关资源
      最近更新 更多