2015-10-26 3 views
1

Я столкнулся с проблемой с GridView Control. У нас было рабочее приложение Windows Store на 8.1, где у GridView левые и правые клики мыши имели разную функциональность. В случае щелчка левой кнопкой мыши мы использовали событие «ItemClick», которое выполняет навигацию на другую страницу XAML. Щелкнув правой кнопкой мыши GridItem, он выбирается и отображает панель приложений, для этого мы использовали событие «SelectionChanged».GridView в UWP

Old Selected Item View in 8.1

Мы теперь мигрирующие наши существующие окна магазина приложение для UWP Application, мы использовали тот же GridView код, мы видим существенную разницу в функциональности и выглядеть & чувствовать, что мы не видим GridView Изделие выбрано как выше картина. Мы видим, что «ItemClick» и «SelectionChanged» работают вместе. Поток - это что-то вроде этого при щелчке левой кнопкой мыши на элементе, элемент управления переходит к событию SelectionChanged, а затем ItemClick. Мы не смогли дифференцировать действия, такие как щелчок левой кнопкой мыши и правой кнопкой мыши, поскольку оба события активируются при щелчке левой кнопкой мыши/нажатием. У нас есть разная функциональность по левому и правому щелчкам мыши.

Нужна помощь в том, как имитировать функции Windows 8.1 в UWP.

ответ

3

Мое требование было я хотел использовать Контекстное/Long резьбовыми, чтобы выбрать пункт и принять соответствующие меры из App Bar кнопки и щелкните левой кнопкой мыши/Tap должен перенаправить меня к следующему XAML странице. Проблема, с которой я столкнулся, была нажатием правой кнопки мыши, я не смог обнаружить, какие элементы GridView были нажаты, и как добавить это в SelectedItem.

Что я сделал, я ввел дополнительную сетку в DataTemplate из GridView. Внутри этой сетки я добавил Событие 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 
     } 
    } 

Причина, почему мы делаем этот путь, потому что теперь мы можем добавить Clicked элемент в GridView SelectedItem с помощью правой кнопкой мыши. Теперь в UWP щелкнутые элементы добавляются в SelectedItem, используя только левый клик. И левой кнопкой мыши, я могу перейти на другую страницу, используя ItemClick событие.

3

Вы правы, произошли изменения в поведении модели взаимодействия. Согласно статье MSDN How to change the interaction mode (XAML)

  • Для выбора, установите IsItemClickEnabled к ложному и SelectionMode к любому значению, кроме ListViewSelectionMode.None и обрабатывать SelectionChanged события (ItemClick не поднимается в данном случае).
  • Для вызова, установите IsItemClickEnabled в true и SelectionMode на ListViewSelectionMode.None и обработайте событие ItemClick (SelectionChanged в этом случае не создается).
  • Другая комбинация - установить IsItemClickEnabled в false и SelectionMode to ListViewSelectionMode.None. Это конфигурация только для чтения .
  • Конечной конфигурацией, которая используется наименее часто, является установка IsItemClickEnabled для true и SelectionMode для любого значения, кроме ListViewSelectionMode.None. В этой конфигурации первый ItemClick имеет значение , а затем SelectionChanged.

Возможно, вы используете последнюю опцию - IsItemClickEnabled установлен в значение true, а SelectionMode - то, что не является None. Согласно Microsoft, это используется наименее часто, поэтому, возможно, было бы хорошей идеей переосмыслить этот проект?

Поскольку вы не поделились никакими кодами, которые вы уже пробовали, я просто заброшу одну идею: возможно, играя с Tapped и RightTapped обработчиками событий, вы могли бы лучше различать эти два?

+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 выбрал нужный элемент, на нем могут быть выполнены другие действия, такие как удаление, копия.

Смежные вопросы