C# UWP中的GridView

C# UWP中的GridView,c#,gridview,selecteditem,uwp,C#,Gridview,Selecteditem,Uwp,我面临GridView控件的问题。我们在8.1上有一个Windows应用商店应用程序,GridView的鼠标左键和右键点击具有不同的功能。在鼠标左键单击的情况下,我们使用“ItemClick”事件执行到另一个XAML页面的导航。右键单击GridItem,它被选中并显示appbar,我们使用了“SelectionChanged”事件 我们现在正在将现有的windows应用商店应用程序迁移到UWP应用程序,我们使用了相同的gridView代码,我们发现功能和外观有显著差异,我们没有看到像上图那样选

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

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


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

没错,交互模型行为发生了变化。根据MSDN文章

  • 对于选择,将IsItemClickEnabled设置为false,将SelectionMode设置为false 除ListViewSelectionMode.None之外的任何值,并处理 SelectionChanged事件(在这种情况下不会引发ItemClick)
  • 对于调用,将IsItemClickEnabled设置为true,将SelectionMode设置为true ListViewSelectionMode.None并处理ItemClick事件 (在这种情况下,不会引发SelectionChanged)
  • 另一种组合是将IsItemClickEnabled设置为false和 SelectionMode至ListViewSelectionMode.None。这是只读的 配置
  • 最后一个最不常用的配置是设置 IsItemClickEnabled为true,SelectionMode为除 ListViewSelectionMode.None。在此配置中,单击第一项是 引发,然后引发SelectionChanged
您似乎正在使用最后一个选项-IsItemClickEnabled设置为true,SelectionMode设置为非None。根据微软的说法,这是最不常用的,所以也许重新考虑一下这个设计是个好主意

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


我的要求是,我想使用右键单击/长按选择一个项目,并从应用程序栏按钮中相应地执行操作,左键单击/长按应将我重定向到下一个XAML页面。我面临的问题是右键单击,我无法检测到GridView的哪些项目已被单击,如何将其添加到SelectedItem

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

示例代码段如下所示

 <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>

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

要识别左键单击和右键单击,右键单击可以使用rightstapped事件

<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}">

从右击可以从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

私有子myGridView_RightTapped(发送方作为对象,e作为RightTappedRoutedEventArgs)处理myGridView.RightTapped
myGridView.SelectedItem=e.OriginalSource
端接头

现在RightClick已经选择了所需的项目,可以对其执行进一步的操作,如删除、复制。

我已经尝试使用RightTapped,但这并不能告诉我在GridView中选择了哪个项目。在新设计的思考方面需要建议。我的右键单击选择项目,并根据单击的类别显示不同的应用程序栏按钮,左键单击/点击导航。我可以使用哪个控件/事件来提供这两个功能。
private void categoryItemsGV_RightTapped(object sender, RightTappedRoutedEventArgs e)
{
   var tablemod = (sender as GridView).SelectedItem;
}
        <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