我正在使用C#和XAML创建一个WP8.1应用程序。我的ListView中包含TextBlock。这些TextBlock具有Tapped事件处理程序,但是当其中一个TextBlock被点击时,我想阻止单元格被选择。设置TappedRoutedEventArgs.Handled = true;并不能停止ListViewItem被选中。因为层次结构的原因,我无法遍历TextBlock的父元素以获取ListViewContainer。那么最好的方法是什么?
<ListView IsItemClickEnabled="True" ItemClick="ItemClickHandler" SelectionMode="None">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="SomeText" Tapped="TextTapped" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
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事件。”
在控件上使用属性IsHitTestVisible="False"。这样,鼠标事件将穿过它。
我遇到了一个与自定义控件有关的问题,它位于 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;
}
当点击文本块列表时,选择更改事件会在文本块点击事件之前被触发(因此是1.选择更改事件,然后是文本块点击)。这就是为什么在文本块点击的情况下,所选项目更改事件将始终被触发。如果我们使用按钮控件(任何具有某些点击操作的控件),它将引发按钮点击事件,但不会引发选择更改事件。
在您的情况下,您可以实现一些技巧。例如,在选择更改事件中继续选择,并在事件到达文本块点击事件时恢复选择。
希望这可以帮助您。
如果您不想选择您的 ListView 项,我认为您可以尝试使用 IsItemClickEnabled property 进行辅助:
默认情况下,用户可以通过轻点或单击来选择视图中的项目。您可以更改此行为,使用户交互触发点击事件而不是触发项选择。
如果将 IsItemClickEnabled 属性设置为 true,则必须将 SelectionMode 属性设置为 ListViewSelectionMode.None。处理 ItemClick 事件以响应用户交互。