首页 > 解决方案 > CommandBarFlyout 和 OverlayInputPassThroughElement

问题描述

GridView当我单击元素时,我想做的事情CommandBarFlyout是关闭并且单击元素。我试图分配值OverlayInputPassThroughElement sender as FrameworkElement。但我还需要点击两次。

XAML:

<Page.Resources>
    <CommandBarFlyout x:Name="CommandBarFlyout1"
                      Placement="RightEdgeAlignedTop">
        <AppBarButton x:Name="EditButton1" 
                      Label="Edit" 
                      Icon="Edit"/>
        <AppBarButton x:Name="DeleteButton1" 
                      Label="Delete" 
                      Icon="Delete"/>
    </CommandBarFlyout>
</Page.Resources>

<Grid>
    <GridView Padding="20">
        <GridView.ItemTemplate>
            <DataTemplate>
                <Grid PointerEntered="Grid_PointerEntered"
                      PointerExited="Grid_PointerExited"
                      Tapped="Grid_Tapped">
                    <Border Height="200" Width="200">
                        <TextBlock Text="{Binding}" 
                           FontSize="48" Foreground="Green"/>
                    </Border>
                </Grid>
            </DataTemplate>
        </GridView.ItemTemplate>
        <GridView.Items>
            <x:String>One</x:String>
            <x:String>Two</x:String>
        </GridView.Items>
    </GridView>
</Grid>

CS:

private void Grid_PointerEntered(object sender, PointerRoutedEventArgs e)
{
    FlyoutShowOptions myOption = new FlyoutShowOptions();
    myOption.ShowMode = FlyoutShowMode.Transient;
    myOption.Placement = FlyoutPlacementMode.RightEdgeAlignedTop;
    CommandBarFlyout1.OverlayInputPassThroughElement = sender as FrameworkElement;
    CommandBarFlyout1.ShowAt(sender as FrameworkElement, myOption);
}

private void Grid_PointerExited(object sender, PointerRoutedEventArgs e)
{
    CommandBarFlyout1.OverlayInputPassThroughElement = null;
    CommandBarFlyout1.Hide();
}

private void Grid_Tapped(object sender, TappedRoutedEventArgs e)
{
    Debug.WriteLine("Grid Click!");
}

或者你可以告诉我如何正确地做

标签: uwp

解决方案


Tapped我通过替换ItemClickin解决了这个问题GridView

<Grid>
    <GridView Padding="20"
              IsItemClickEnabled="True"
              ItemClick="GridView_ItemClick">
        <GridView.ItemTemplate>
            <DataTemplate>
                <Grid PointerEntered="Grid_PointerEntered">
                    <Border Height="200" Width="200">
                        <TextBlock Text="{Binding}" 
                           FontSize="48" Foreground="Green"/>
                    </Border>
                </Grid>
            </DataTemplate>
        </GridView.ItemTemplate>
        <GridView.Items>
            <x:String>One</x:String>
            <x:String>Two</x:String>
        </GridView.Items>
    </GridView>
</Grid>

private void Grid_PointerEntered(object sender, PointerRoutedEventArgs e)
{
    FlyoutShowOptions myOption = new FlyoutShowOptions();
    myOption.ShowMode = FlyoutShowMode.Transient;
    myOption.Placement = FlyoutPlacementMode.RightEdgeAlignedTop;
    CommandBarFlyout1.ShowAt(e.OriginalSource as FrameworkElement, myOption);
}

private void GridView_ItemClick(object sender, ItemClickEventArgs e)
{
    Debug.WriteLine("Grid Click!");
}

推荐阅读