UWP 中的网格视图

GridView in UWP

我遇到了 GridView 控件的问题。我们在 8.1 上有一个可用的 Windows Store 应用程序,其中 GridView 鼠标左键和右键单击具有不同的功能。在鼠标左键单击的情况下,我们过去使用“ItemClick”事件执行导航到另一个 XAML 页面。右键单击 GridItem,它会被选中并显示应用栏,为此我们使用了“SelectionChanged”事件。

我们现在正在将我们现有的 windows 商店应用程序迁移到 UWP 应用程序,我们使用了相同的 gridView 代码,我们发现功能和外观有显着差异,我们没有看到像上面那样选择的 GridView 项目图片。我们看到“ItemClick”和“SelectionChanged”一起工作。流程类似于左键单击项目,控件转到 SelectionChanged 事件,然后转到 ItemClick。我们无法区分鼠标左键单击和鼠标右键单击等操作,因为这两个事件都是在单击左侧 click/tapping 时触发的。我们在鼠标左键和右键上有不同的功能。

需要有关如何在 UWP 中模仿 windows 8.1 功能的帮助。

你是对的,交互模型行为发生了变化。根据 MSDN 文章 How to change the interaction mode (XAML)

  • 对于选择,将 IsItemClickEnabled 设置为 false,将 SelectionMode 设置为 ListViewSelectionMode.None 以外的任何值并处理 SelectionChanged 事件(在这种情况下不会引发 ItemClick)。
  • 对于调用,将 IsItemClickEnabled 设置为 true 并将 SelectionMode 设置为 ListViewSelectionMode.None 并处理 ItemClick 事件 (在这种情况下不会引发 SelectionChanged)。
  • 另一种组合是将 IsItemClickEnabled 设置为 false 并且 选择模式为 ListViewSelectionMode.None。这是只读的 配置。
  • 最后一个用得最少的配置是设置 IsItemClickEnabled 为真,SelectionMode 为任何值,除了 ListViewSelectionMode.None。在此配置中,第一个 ItemClick 是 引发,然后引发 SelectionChanged。

您似乎在使用最后一个选项 - IsItemClickEnabled 设置为 true 并且 SelectionMode 设置为不是 None 的内容。根据微软的说法,这是最少使用的,所以重新考虑这个设计也许是个好主意?

由于您还没有分享任何您已经尝试过的代码,我只提出一个想法:也许使用 TappedRightTapped 事件处理程序可以帮助您区分两者更容易?

我的要求是我想使用 Right Click/Long 点击 select 一个项目并从 App Bar Buttons 采取相应的行动,在 Left Click/Tap 应该将我重定向到下一个 XAML 页。我面临的问题是右键单击,我无法检测到 GridView 的哪些项目已被单击以及如何将其添加到 SelectedItem 中。

我所做的是,我在GridView 的DataTemplate 中引入了额外的Grid。在这个网格中,我添加了 RightTapped 事件。

示例代码片段是

 <GridView x:Name="ItemGridView"   
              ItemsSource="{Binding Source={StaticResource ItemsViewSource}}" 
              IsItemClickEnabled="True" 
              SelectionMode="Single" ItemClick="ItemGridView_ItemClick" 
              SelectionChanged="ItemGridView_SelectionChanged">
        <GridView.ItemTemplate>
            <DataTemplate>
                <Grid RightTapped="Grid_RightTapped">
                    <Border Background="White"  BorderThickness="0" Width="210" Height="85">
                        <TextBlock Text="{Binding FileName}" />
                    </Border>
                </Grid>
            </DataTemplate>
        </GridView.ItemTemplate>
    </GridView>

活动名称是Grid_RightTapped。这帮助我检测到我从哪个 GridViewItem 获得了长时间的 tap/right 点击。

此代码隐藏是:

 private void Grid_RightTapped(object sender, RightTappedRoutedEventArgs e)
    {
        Song selectedItem = (sender as Grid).DataContext as Song;
        //the above line will get the exact GridViewItem where the User Clicked
        this.ItemGridView.SelectedItem = selectedItem;
        //the above line will add the item into SelectedItem and hence, I can take any action after this which I require
        }
    }

我们这样做的原因是,因为现在我们可以使用右键单击将单击的项目添加到 GridView SelectedItem 中。现在在 UWP 中,单击的项目仅使用左键单击添加到 SelectedItem 中。通过左键单击,我可以使用 ItemClick 事件导航到另一个页面。

识别左击和右击,对于右击可以使用RightTapped事件

<GridView x:Name="categoryItemsGV"
   Margin="5,5,0,0"
   IsItemClickEnabled="True" 
   ItemClick="categoryItemsGV_ItemClick" 
   IsRightTapEnabled="True" 
   RightTapped="categoryItemsGV_RightTapped"
   SelectionMode="Single"
   SizeChanged="categoryItemsGV_SizeChanged"
   ItemsSource="{Binding}">

.cs 代码如下:

private void categoryItemsGV_RightTapped(object sender, RightTappedRoutedEventArgs e)
{
   var tablemod = (sender as GridView).SelectedItem;
}

From RightTapped 鼠标右键点击的项目可以从e.OriginalSource

获得
        <GridView x:Name="myGridView" VerticalAlignment="Center">
            <GridView.ContextFlyout>
                <MenuFlyout>
                    <MenuFlyoutItem Text="Reset"/>
                    <MenuFlyoutSeparator/>
                    <MenuFlyoutItem Text="Repeat"/>
                    <MenuFlyoutItem Text="Shuffle"/>
                </MenuFlyout>
            </GridView.ContextFlyout>
        </GridView>


Private Sub myGridView_RightTapped(sender As Object, e As RightTappedRoutedEventArgs) Handles myGridView.RightTapped
myGridView.SelectedItem = e.OriginalSource
End Sub

现在右键已经选择了想要的项目,进一步的操作如删除,复制可以在它上面执行。