防止XAML中的已点击事件传播到父元素

5
我正在使用C#和XAML创建一个WP8.1应用程序。我的ListView中包含TextBlock。这些TextBlock具有Tapped事件处理程序,但是当其中一个TextBlock被点击时,我想阻止单元格被选择。设置TappedRoutedEventArgs.Handled = true;并不能停止ListViewItem被选中。因为层次结构的原因,我无法遍历TextBlock的父元素以获取ListViewContainer。那么最好的方法是什么?
5个回答

2
好的,下面是我解决这个问题的方法。
XAML:
<ListView IsItemClickEnabled="True" ItemClick="ItemClickHandler" SelectionMode="None">
   <ListView.ItemTemplate>
      <DataTemplate>
         <TextBlock Text="SomeText" Tapped="TextTapped" />
      </DataTemplate>
   </ListView.ItemTemplate>
</ListView>

C#
private bool IsItemClickDisabled;

private void TextTapped(object sender, TappedRoutedEventArgs e)
{
   IsItemClickDisabled = true;
   //TODO: Your tap event handler

   e.Handled = true;
}

private async void ItemClickHandler(object sender, ItemClickEventArgs e)
{
   IsItemClickDisabled = false; //Reset each time
   await System.Threading.Tasks.Task.Delay(TimeSpan.FromMilliseconds(1));
   if (!IsItemClickDisabled)
   {
      //TODO: ItemClick handler
   }
}

通常情况下,ItemClickHandler将首先被执行,但我们会延迟此事件,以便其他事件可以执行。如果执行了任何点击事件,我们只需说:“好的,我们将执行此代码,无需执行ItemClick事件。”


脏的方法,但让我摆脱了麻烦!谢谢! - Padraic

2

在控件上使用属性IsHitTestVisible="False"。这样,鼠标事件将穿过它。


1

我遇到了一个与自定义控件有关的问题,它位于 ListViewItem 上。我重写了 OnPointerPressed 事件,并将其标记为已处理,除了触摸事件之外,这还阻止了 listview 接收选择事件。

protected override void OnPointerPressed(PointerRoutedEventArgs e)
{
  base.OnPointerPressed(e);
  e.Handled = true;
}

以上内容适用于派生自己的控件,但您也可以在任何控件上挂钩事件并将其标记为已处理,例如:
<TextBlock Text="whatever" Tapped="UIElement_OnTapped"
    PointerPressed="UIElement_OnPointerPressed"/>

然后在代码中。
private void UIElement_OnTapped(object sender, TappedRoutedEventArgs e)
{
  e.Handled = true;
}

private void UIElement_OnPointerPressed(object sender, PointerRoutedEventArgs e)
{
  e.Handled = true;
}

0

当点击文本块列表时,选择更改事件会在文本块点击事件之前被触发(因此是1.选择更改事件,然后是文本块点击)。这就是为什么在文本块点击的情况下,所选项目更改事件将始终被触发。如果我们使用按钮控件(任何具有某些点击操作的控件),它将引发按钮点击事件,但不会引发选择更改事件。

在您的情况下,您可以实现一些技巧。例如,在选择更改事件中继续选择,并在事件到达文本块点击事件时恢复选择。

希望这可以帮助您。


0

如果您不想选择您的 ListView 项,我认为您可以尝试使用 IsItemClickEnabled property 进行辅助:

默认情况下,用户可以通过轻点或单击来选择视图中的项目。您可以更改此行为,使用户交互触发点击事件而不是触发项选择。

如果将 IsItemClickEnabled 属性设置为 true,则必须将 SelectionMode 属性设置为 ListViewSelectionMode.None。处理 ItemClick 事件以响应用户交互。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接