2015-10-26 109 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選擇了所需的項目,可以在其上執行進一步的操作,如刪除,複製。