防止传播到父元素xaml的抽头事件

时间:2014-06-02 23:10:45

标签: c# events winrt-xaml windows-phone-8.1

我正在使用C#和XAML创建WP8.1应用

我有一个ListView,其中ListViewItems包含一个TextBlock。

TextBlocks有Tapped =""事件处理程序,但是我想在点击其中一个TextBlock时停止选择单元格。

设置 TappedRoutedEventArgs.Handled = true; 没有停止选择ListViewItem。

(由于层次结构,我无法遍历TextBlocks父元素以获取ListViewContainer)。

最好的方法是什么?

5 个答案:

答案 0 :(得分:2)

好的,这就是我如何解决这个问题。

XAML:

        $('body').on('click', '#Export', function(e) {

            $('#loading').show();

            @*/*----if using ajax: spinner loads and hides but dialog box doesn't show up-------*/
            $.ajax({
                url: '@Url.Action("ExportToWord", "Export")',
                cache: false,
                data: { customerId: custId, solutionId: solId },
                success: function(result) {

                    window.open(result); // doesn't work

                    $('body').find('#loading').hide();

                },
                error: function(r) {

                }
            });*@

        });

C#

<ListView IsItemClickEnabled="True" ItemClick="ItemClickHandler" SelectionMode="None">
   <ListView.ItemTemplate>
      <DataTemplate>
         <TextBlock Text="SomeText" Tapped="TextTapped" />
      </DataTemplate>
   </ListView.ItemTemplate>
</ListView>

因此,通常,ItemClickHandler将首先执行,但我们会延迟此事件,因此可以执行另一个事件。如果执行了任何tapped事件,我们只会说:&#34;好的,我们将执行此代码,无需执行ItemClick事件。&#34;

答案 1 :(得分:2)

在控件上使用属性IsHitTestVisible =“False”。鼠标事件将通过它。

答案 2 :(得分: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;
}

答案 3 :(得分:0)

当点击文本块列表视图选择时,在文本块点击事件之前引发更改事件(因此1. SelectionChanged事件比文本块点击)。这就是选择项目更改事件的方式将始终在文本块点击时触发。如果我们使用按钮控件(任何具有轻击操作的控件),它将提升按钮点击事件但不会引发选择更改事件。

在你的情况下,你可以实施一些黑客攻击。喜欢继续选择更改事件中的选择,并在事件到达文本块点击事件时还原选择。

希望这有帮助

答案 4 :(得分:0)

如果您不想选择ListView项目,我认为您可以尝试在IsItemClickEnabled property的帮助下完成:

  

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

     

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