2015-10-26 110 views
1

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

Old Selected Item View in 8.1

现在我们正在迁移我们现有的Windows应用商店的应用UWP应用程序,我们使用相同的GridView的代码,我们发现在功能上显著差异,看&感觉,我们没有看到GridView的项目中选择像上面图片。我们看到“ItemClick”和“SelectionChanged”正在一起工作。该流程类似于左键单击该项目,控件进入SelectionChanged事件,然后ItemClick。我们无法区分左键单击和右键单击等操作,因为点击左键单击/点击时,两个事件都会启动。我们在左右点击鼠标上有不同的功能。

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

回答

3

我的要求是我想用右键/长螺纹选择一个项目,并从应用程序栏按钮和鼠标左键点击相应采取行动/ 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获得长按/右键单击。

代码隐藏的是这样的:

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

3

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

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

您似乎正在使用最后一个选项 - IsItemClickEnabled设置为true,SelectionMode设置为非None。根据微软的说法,这种情况的使用最少,所以反思这种设计可能是一个好主意?

既然你还没有分享过任何你已经试过的代码,那么我只会提出一个想法:也许玩TappedRightTapped事件处理程序可以帮助你更轻松地区分两者吗?

+0

我尝试过使用RightTapped,但它没有给我哪个项目已被选中在GridView中。并且需要对新设计进行思考。我的右键单击选择项目,并显示不同的应用程序栏按钮根据哪个类别被点击和左键单击/点击导航。我可以使用哪种控制/事件,这将使我能够提供这两种功能。 – Aakansha

0

要确定左,右键单击,右单击,您可以使用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; 
} 
+0

感谢Croxy ... –

0

从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选择了所需的项目,可以在其上执行进一步的操作,如删除,复制。