防止打开CommandBar吞噬Pointer事件

时间:2016-10-31 15:12:24

标签: xaml uwp uwp-xaml

我有一个带有CommandBar的Grid。我只想在指针悬停网格或任何子组件时显示CommandBar。

我通过在PointerEntered事件中将IsOpen设置为true来显示CommandBar。不幸的是,打开的CommandBar正在吞下PointerExited事件,我无法关闭CommandBar。

我发现的事情:

  • 如果我将IsEnabled设置为true,则CommandBar运行正常...除了我的按钮被禁用;)
  • 如果我设置ClosedDisplayMode而不是IsOpen也可以 - 但隐藏和打开之间没有很好的过渡

什么是吞噬我的指针事件,我该如何预防?或者你对我的问题有不同的解决方案吗?

这是一个简化的例子:

<!-- Some content -->

<!-- Grid with command bar -->
<Grid Height="300" Width="700" PointerEntered="Grid_PointerEntered" PointerExited="Grid_PointerExited" BorderBrush="Black" BorderThickness="1">
  <!-- Template just set Visibility of "MoreButton" to Collapsed (hiding it because it is not needed if you have hover ability) -->
  <CommandBar VerticalAlignment="Bottom" Canvas.ZIndex="1" x:Name="uxCommandBar" Template="{StaticResource CommandBarControlTemplate1}">
    <!-- Buttons -->                  
  </CommandBar>

  <!-- Other content stuff - here a Canvas for providing a hoverable area -->
  <Canvas HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Red"></Canvas>
</Grid>

1 个答案:

答案 0 :(得分:1)

有两件事情会浮现在脑海中:

  1. 默认情况下,命令栏的IsSticky为false,这意味着它会在轻度关闭时自动将IsOpen设置为false(即,如果单击命令栏元素之外的任何位置)。它通过在打开时显示命令栏和透明网格作为弹出窗口来实现。透明网格是吃指针事件的原因。将IsSticky设置为true可以防止此行为。
  2. 可以直接在页面上设置命令栏(通过TopAppBar / BottomAppBar属性),也可以将其作为子元素放在可视树中的任何位置。您可能需要将命令栏设置为网格中某个位置的子元素,而不是直接在页面上设置它,否则只要将鼠标移到命令栏上,就会触发PointerExited事件。
  3. <Page>
        <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
            <Grid PointerEntered="Grid_PointerEntered" PointerExited="Grid_PointerExited">
                <CommandBar x:Name="bar" IsSticky="True" VerticalAlignment="Bottom">
                    <AppBarButton Icon="Accept" Label="Done"/>
                </CommandBar>
            </Grid>
        </Grid>
    </Page>
    
    private void Grid_PointerEntered(object sender, PointerRoutedEventArgs e)
    {
        bar.IsOpen = true;
    }
    
    private void Grid_PointerExited(object sender, PointerRoutedEventArgs e)
    {
        bar.IsOpen = false;
    }