UWP ListView - DragOver больше не вызывается - PullRequest
0 голосов
/ 29 мая 2018

Я столкнулся с проблемой, которую не могу решить.У меня есть ListView, и мне нужно настроить стиль элемента, когда пользователь перетаскивает объект поверх элемента представления списка.Из-за сложности моих состояний я не хочу сохранять ListViewItemPresenter в расширенном стиле ListViewItem.Поэтому, когда я удаляю этого презентатора и определяю свой собственный стиль (в основном классический презентатор контента + overlay + underlay + VisualStateGroups для определения анимации), я больше не получаю события DragOver и Drop в моих объектах элементов списка.Я не понимаю почему?Если я сохраню стиль контейнера элементов по умолчанию, он будет работать нормально ... Что я пропустил?

Позвольте мне пойти немного дальше с некоторым кодом.Вот мой список, который определяет ItemTemplate и ItemContainerStyle :

<ListView x:Name="notebookListView"  
          ItemsSource="{x:Bind NoteBookItems}" 
          ItemTemplate="{StaticResource NotebookItemListViewTemplate}"
          ItemContainerStyle="{StaticResource notebookItemContainerStyle}"
          IsItemClickEnabled="True"
          SelectionMode="Single"
          AllowDrop="True" CanReorderItems="False" CanDragItems="True"
          DragItemsStarting="NotebookListView_DragItemsStarting"
          DragItemsCompleted="NotebookListView_DragItemsCompleted"
          ItemClick="NotebookItem_Click" />

Вот шаблон элемента, который определяет DragOver и Drop method:

<DataTemplate x:Name="NotebookItemListViewTemplate" x:DataType="model:NotebookItem">
  <Grid x:Name="notebook" HorizontalAlignment="Left" Height="48" Width="320"
        AllowDrop="True"
        DragOver="DragOverNotebookItem" 
        Drop="DropInNotebookItem">
   [...]
  </Grid>
</DataTemplate>

И, наконец, мой расширенный стиль контейнера элемента:

<Style x:Key="notebookItemContainerStyle" TargetType="ListViewItem">
  <!-- all default setter properties ... -->
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="ListViewItem">
        <!-- Here is my customization with VisualState to catch PointerOver and other events above my list items -->
        <Grid>
          <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="CommonStates">
              <VisualState x:Name="Normal" />
              <VisualState x:Name="PointerOver">
                <Storyboard>
                  <ColorAnimation Storyboard.TargetName="overlay" Duration="0" To="{StaticResource ColorUIBlackAlpha04}" Storyboard.TargetProperty="(Rectangle.Fill).(SolidColorBrush.Color)" />
                </Storyboard>
              </VisualState>
              <VisualState x:Name="Pressed">
                <Storyboard>
                  <ColorAnimation Storyboard.TargetName="overlay" Duration="0" To="{StaticResource ColorUIBlackAlpha12}" Storyboard.TargetProperty="(Rectangle.Fill).(SolidColorBrush.Color)" />
                </Storyboard>
              </VisualState>
              <VisualState x:Name="PressedSelected">
                <Storyboard>
                  <ColorAnimation Storyboard.TargetName="overlay" Duration="0" To="{StaticResource ColorUIBlackAlpha12}" Storyboard.TargetProperty="(Rectangle.Fill).(SolidColorBrush.Color)" />
                </Storyboard>
              </VisualState>
              <VisualState x:Name="Selected">
                <Storyboard>
                  <ColorAnimation Storyboard.TargetName="overlay" Duration="0" To="Transparent" Storyboard.TargetProperty="(Rectangle.Fill).(SolidColorBrush.Color)" />
                </Storyboard>
              </VisualState>
            </VisualStateGroup>
          </VisualStateManager.VisualStateGroups>
          <!-- and a Grid that contains the definition of the item content -->
          <Grid>
            <Rectangle x:Name="underlay" Stroke="Transparent" Fill="Transparent" Margin="0" />
            <ContentPresenter Margin="{TemplateBinding Padding}"
                              Background="Transparent"
                              HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
                              VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/>
            <Rectangle x:Name="overlay" Stroke="Transparent" Fill="Transparent" Margin="0" />
          </Grid>
        </Grid>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

С этим кодом событие DragOver моего элементаникогда не срабатывает.Но если я использую стиль контейнера элемента по умолчанию со списком ListViewItemPresenter по умолчанию, он работает нормально.Я не понимаю, почему ... Может ли кто-нибудь помочь мне понять, что происходит?

Вот стиль контейнера элемента представления списка по умолчанию, с ListViewItemPresenter вместо моего привычного:

<Style x:Key="notebookItemContainerStyle" TargetType="ListViewItem">
  <Setter Property="FontFamily" Value="{ThemeResource ContentControlThemeFontFamily}"/>
  <Setter Property="FontSize" Value="{ThemeResource ControlContentThemeFontSize}"/>
  <Setter Property="Background" Value="{ThemeResource ListViewItemBackground}"/>
  <Setter Property="Foreground" Value="{ThemeResource ListViewItemForeground}"/>
  <Setter Property="TabNavigation" Value="Local"/>
  <Setter Property="IsHoldingEnabled" Value="True"/>
  <Setter Property="Padding" Value="12,0,12,0"/>
  <Setter Property="HorizontalContentAlignment" Value="Left"/>
  <Setter Property="VerticalContentAlignment" Value="Center"/>
  <Setter Property="MinWidth" Value="{ThemeResource ListViewItemMinWidth}"/>
  <Setter Property="MinHeight" Value="{ThemeResource ListViewItemMinHeight}"/>
  <Setter Property="AllowDrop" Value="True"/>
  <Setter Property="UseSystemFocusVisuals" Value="True"/>
  <Setter Property="FocusVisualMargin" Value="0"/>
  <Setter Property="FocusVisualPrimaryBrush" Value="{ThemeResource ListViewItemFocusVisualPrimaryBrush}"/>
  <Setter Property="FocusVisualPrimaryThickness" Value="2"/>
  <Setter Property="FocusVisualSecondaryBrush" Value="{ThemeResource ListViewItemFocusVisualSecondaryBrush}"/>
  <Setter Property="FocusVisualSecondaryThickness" Value="1"/>
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="ListViewItem">
        <ListViewItemPresenter CheckBrush="{ThemeResource ListViewItemCheckBrush}" 
                               ContentMargin="{TemplateBinding Padding}" 
                               CheckMode="{ThemeResource ListViewItemCheckMode}" 
                               ContentTransitions="{TemplateBinding ContentTransitions}" 
                               CheckBoxBrush="{ThemeResource ListViewItemCheckBoxBrush}" 
                               DragForeground="{ThemeResource ListViewItemDragForeground}" 
                               DragOpacity="{ThemeResource ListViewItemDragThemeOpacity}" 
                               DragBackground="{ThemeResource ListViewItemDragBackground}" 
                               DisabledOpacity="{ThemeResource ListViewItemDisabledThemeOpacity}" 
                               FocusBorderBrush="{ThemeResource ListViewItemFocusBorderBrush}" 
                               FocusSecondaryBorderBrush="{ThemeResource ListViewItemFocusSecondaryBorderBrush}" 
                               HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" 
                               Control.IsTemplateFocusTarget="True" 
                               PointerOverForeground="{ThemeResource ListViewItemForegroundPointerOver}" 
                               PressedBackground="{StaticResource UIBlackAlpha12}" 
                               PlaceholderBackground="{ThemeResource ListViewItemPlaceholderBackground}" 
                               PointerOverBackground="{StaticResource UIBlackAlpha04}" 
                               ReorderHintOffset="{ThemeResource ListViewItemReorderHintThemeOffset}" 
                               SelectedPressedBackground="Transparent" 
                               SelectionCheckMarkVisualEnabled="{ThemeResource ListViewItemSelectionCheckMarkVisualEnabled}" 
                               SelectedForeground="{ThemeResource ListViewItemForegroundSelected}" 
                               SelectedPointerOverBackground="Transparent" 
                               SelectedBackground="Transparent" 
                               VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

1 Ответ

0 голосов
/ 31 мая 2018

Я мог бы воспроизвести вашу проблему, но я не знаю причину, вызвавшую эту проблему.Я буду продолжать изучать этот вопрос.В настоящее время есть обходной путь для вас.Я обнаружил, что вы хотите изменить цвет underlay overlay Прямоугольник.Вы можете реализовать это в коде, а не в xaml с Visualtreehelper.

private void MYListview_SelectionChanged(object sender, SelectionChangedEventArgs e)
{

    StackPanel test = MyFindListViewChildByName(MYListview.ContainerFromItem(MYListview.SelectedItem), "MyTest") as StackPanel;
    test.Background = new SolidColorBrush(Colors.White);
}

public static DependencyObject MyFindListViewChildByName(DependencyObject parant, string ControlName)
{
    int count = VisualTreeHelper.GetChildrenCount(parant);

    for (int i = 0; i < count; i++)
    {
        var MyChild = VisualTreeHelper.GetChild(parant, i);
        if (MyChild is FrameworkElement && ((FrameworkElement)MyChild).Name == ControlName)
            return MyChild;

        var FindResult = MyFindListViewChildByName(MyChild, ControlName);
        if (FindResult != null)
            return FindResult;
    }

    return null;
}

. Вы можете использовать VisualTreeHelper, чтобы получить underlay overlay экземпляр Rectangle, а затем создать для них анимацию.Вы можете вызвать эту анимацию вручную в обработчике событий ListViewItem, которая соответствует xaml VisualStateGroup.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...