【问题标题】:GridView in UWPUWP 中的 GridView
【发布时间】:2016-01-26 02:54:52
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# gridview selecteditem uwp


    【解决方案1】:

    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
    

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

    【讨论】:

      【解决方案2】:

      要识别左右点击,右键点击可以使用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;
      }
      

      【讨论】:

        【解决方案3】:

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

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

        示例代码sn-p为

         <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 中获得了长按/右键单击。

        这个的代码隐藏是:

         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 事件导航到另一个页面。

        【讨论】:

          【解决方案4】:

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

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

          您似乎正在使用最后一个选项 - IsItemClickEnabled 设置为 true,SelectionMode 设置为非 None。根据微软的说法,这是最不常用的,所以重新考虑这种设计可能是个好主意?

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

          【讨论】:

          • 我尝试过使用 RightTapped 但这并没有告诉我在 GridView 中选择了哪个项目。并且需要就新设计的思考提出建议。我的右键单击选择项目并根据单击的类别和左键单击/点击导航显示不同的应用程序栏按钮。我可以使用哪个控件/事件,这将使我能够提供这两种功能。
          猜你喜欢
          • 2020-05-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-18
          • 1970-01-01
          • 1970-01-01
          • 2018-03-21
          • 2017-07-22
          相关资源
          最近更新 更多