首页 > 解决方案 > 使用滚动视图的视图更改时禁用单击等事件的更好方法

问题描述

我按此顺序在另一个视图中使用了一个视图。滚动视图;StakPanel 两个列表视图;GridHere,我插入了一个 pressEvent 来更改 listviewBackground 图像,因为我不知道为什么,当我在 listview 中使用 pressEvent 和 releaseEvent 时,它们从未被触发;所以如果有人知道为什么请回答。此解决方案还有另一个问题:当我垂直滚动列表时,ListView 中的项目也被单击并且我的图像被更改。为了解决这个问题,我正在考虑创建滚动视图的 ViewChanged 和 ViewChanging,如果我的视图垂直滚动,事件将被触发。因此,通过更改“IsItemClickEnabled = False”标志,这只是使滚动工作。然后,在 ViewChanged 事件中,标志改回 IsItemClickEnabled =

![左侧项目未点击右侧项目点击][1]:https ://i.stack.imgur.com/7uCLb.png

<?xml version="1.0" encoding="UTF-8"?>
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:behaviors="using:Microsoft.Toolkit.Uwp.UI.Animations.Behaviors" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:interactivity="using:Microsoft.Xaml.Interactivity" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="IHM.UWP.Views.UserLogin.UserLoginView.ListUsersView" mc:Ignorable="d" Height="1300" Width="900">
   <Page.Background>
      <AcrylicBrush TintColor="#FF4DF7F7" TintOpacity="0.2" Opacity="0.3" />
   </Page.Background>
   <Page.Resources>
      <DataTemplate x:Name="UsersViewTemplate">
         <Grid x:Name="grdListEmployers" Margin="15,15,0,0" IsTapEnabled="False" PointerPressed="grdListEmployers_PointerPressed" IsDoubleTapEnabled="False" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" IsHoldingEnabled="True" TabFocusNavigation="Cycle" ScrollViewer.VerticalScrollMode="Enabled">
            <Grid.Background>
               <ImageBrush />
            </Grid.Background>
            <Grid.RowDefinitions>
               <RowDefinition Height="*" />
               <RowDefinition Height="1" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
               <ColumnDefinition Width="*" />
               <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Image x:Name="b" Source="{Binding BackgroungImage }" Grid.Column="0" Grid.ColumnSpan="3">
               <interactivity:Interaction.Behaviors>
                  <behaviors:Fade x:Name="Fade" Value="0.5" Duration="10000" Delay="18000" />
               </interactivity:Interaction.Behaviors>
            </Image>
            <!--<Border  CornerRadius="5"
                         BorderThickness="2" BorderBrush="LightGray" Margin="5"
                          Grid.Row="0"
                         Height="60"
                         Width="400"
                         Grid.Column="0"
                         Grid.ColumnSpan="3">
                    <Border.Background>
                        <ImageBrush/>
                    </Border.Background>-->
            <StackPanel>
               <TextBlock Text="{Binding Post}" Style="{ThemeResource BaseTextBlockStyle}" Margin="155,50,0,0" Foreground="Yellow" FontFamily="Courier Prime Code" />
               <TextBlock Text="{Binding Nome}" Style="{ThemeResource BodyTextBlockStyle}" Margin="155,0,0,0" Foreground="White" FontSize="20" FontWeight="Bold" FontFamily="Courier Prime Code" />
            </StackPanel>
            <!--</Border>-->
            <!--Height="120"
                         Width="120"

                         VerticalAlignment="Stretch"

                         HorizontalAlignment="Left"
                         Stretch="UniformToFill" FocusVisualPrimaryBrush="#FF231818" FocusVisualSecondaryBrush="Black">
                <Ellipse.RenderTransform>
                    <TranslateTransform Y="-0" X="28">

                    </TranslateTransform>-->
            <Ellipse x:Name="Ellipse" Grid.Row="0" Grid.Column="0" Height="120" Width="120" VerticalAlignment="Stretch" HorizontalAlignment="Left" Stretch="UniformToFill" FocusVisualPrimaryBrush="#FF231818" FocusVisualSecondaryBrush="Black">
               <Ellipse.RenderTransform>
                  <TranslateTransform Y="0" X="28" />
               </Ellipse.RenderTransform>
               <Ellipse.Fill>
                  <ImageBrush ImageSource="{Binding Photo}">
                     <ImageBrush.Transform>
                        <ScaleTransform ScaleX="0.9" ScaleY="0.9" CenterX="20" CenterY="59" />
                     </ImageBrush.Transform>
                  </ImageBrush>
               </Ellipse.Fill>
            </Ellipse>
         </Grid>
      </DataTemplate>
   </Page.Resources>
   <Grid>
      <Grid.ColumnDefinitions>
         <ColumnDefinition />
         <ColumnDefinition />
      </Grid.ColumnDefinitions>
      <Grid.RowDefinitions>
         <RowDefinition Height="1780" />
      </Grid.RowDefinitions>
      <!--<StackPanel Height="69" Width="892" Grid.ColumnSpan="2" Grid.Row="0">

                <StackPanel.Background>
                    <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                        <GradientStop Color=" #808080" Offset="0.0" />
                        <GradientStop Color="#DCDCDC" Offset="0.25" />
                        <GradientStop Color="#A9A9A9" Offset="0.75" />
                    </LinearGradientBrush>

                </StackPanel.Background>

            <TextBlock Text="Usuário" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="27,0,0,0" FontFamily="Courier Prime Code"/>
            </StackPanel>-->
      <ScrollViewer VerticalScrollMode="Enabled" HorizontalScrollMode="Disabled" HorizontalAlignment="Center" VerticalAlignment="Top" Height="1300" Grid.ColumnSpan="2" Grid.Row="0" VerticalScrollBarVisibility="Hidden" IsTapEnabled="False" ViewChanging="ScrollViewer_ViewChanging" ViewChanged="ScrollViewer_ViewChanged">
         <ScrollViewer.Background>
            <SolidColorBrush Color="Aquamarine" Opacity="0.05" />
         </ScrollViewer.Background>
         <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="0,0,0,0" Width="1400" VerticalAlignment="Top" IsTapEnabled="False" IsHoldingEnabled="False" IsDoubleTapEnabled="False">
            <!--<StackPanel.Background>
                            <SolidColorBrush Color="Aquamarine" Opacity="0.05"></SolidColorBrush>
                        </StackPanel.Background>-->
            <ListView x:Name="MasterListView" ItemsSource="{x:Bind userViewModel.user1}" ScrollViewer.VerticalScrollMode="Disabled" ScrollViewer.HorizontalScrollMode="Disabled" SelectionMode="None" ScrollViewer.VerticalScrollBarVisibility="Hidden" IsTapEnabled="False" ShowsScrollingPlaceholders="False" ItemTemplate="{StaticResource UsersViewTemplate}" IsDoubleTapEnabled="False" IsItemClickEnabled="False" VerticalAlignment="Top" IsFocusEngagementEnabled="False" IsHoldingEnabled="False" IsTabStop="False" HorizontalAlignment="Left" IsMultiSelectCheckBoxEnabled="False" TabFocusNavigation="Once" FocusVisualPrimaryBrush="{x:Null}" FocusVisualSecondaryBrush="{x:Null}" />
            <ListView x:Name="MasterListView2" ItemsSource="{x:Bind  userViewModel.user2}" SelectionMode="None" ScrollViewer.VerticalScrollMode="Disabled" ScrollViewer.HorizontalScrollMode="Disabled" IsItemClickEnabled="False" ShowsScrollingPlaceholders="False" ScrollViewer.VerticalScrollBarVisibility="Hidden" ItemTemplate="{StaticResource UsersViewTemplate}" VerticalAlignment="Top" HorizontalAlignment="Right" IsMultiSelectCheckBoxEnabled="False" IsZoomedInView="False" IsTapEnabled="False" IsRightTapEnabled="False" IsHoldingEnabled="False" IsDoubleTapEnabled="False" />
         </StackPanel>
      </ScrollViewer>
   </Grid>
</Page>

{
   private void grdListEmployers_PointerPressed(object sender, PointerRoutedEventArgs e)
   {
       //Here I change image;
   }
      private void ScrollViewer_ViewChanging(object sender, ScrollViewerViewChangingEventArgs e)
        {
            //Here I disable IsItemClicked at ListView

        }


    private void ScrollViewer_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
    {

        //Here I enable IsItemClicked at ListView

    }

标签: listviewuwpscrollviewpressed

解决方案


关于您的 pressEvent,您的意思是不会触发 grdListEmployers 中的 PointerPressed 事件吗?您将 grdListEmployers 中的 IsTapEnabled 设置为 false,因此不会触发事件,您需要将其设置为 true,例如:

<Grid x:Name="grdListEmployers" Margin="15,15,0,0" IsTapEnabled="True" ......>

关于您的第二个问题,您的意思是当您滚动 listView 时,您不希望 ListView 中的项目可以被点击?如果是,您可以在 ViewChanged 事件中检测滚动视图是否完成滚动。

private void ScrollViewer_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
{

    if (e.IsIntermediate)
    {
        MasterListView.IsItemClickEnabled = false;
    }
    else
    {
        MasterListView.IsItemClickEnabled = true;
    }
}

推荐阅读