Itemsstackpanel отключает прокрутку - PullRequest
0 голосов
/ 03 августа 2020

У меня есть панель Itemsstackpanel внутри элемента управления Listview. Я хочу запускать событие PointerWheelChanged всякий раз, когда пользователь находится у края страницы. Когда я помещаю событие в itemsstackpanel, я отключаю возможность прокрутки колесиком мыши. Если событие находится в самом Listview или Grid, оно работает только до тех пор, пока никакие элементы не загружаются в Listview. Является ли это предполагаемым поведением или мне не хватает важной информации? Я исследовал, но не обнаружил причин для этой проблемы или поведения.

ниже мой XAML:

    <Grid Background="Gray">
    <ProgressRing x:Name="progress" IsActive="False" x:FieldModifier="public" Foreground="Black" Height="200" Width="200"/>
    <ListView x:Name="ListViewControl" x:FieldModifier="public" Margin="10,10,10,10" ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
              ScrollViewer.ZoomMode="Enabled" ScrollViewer.VerticalScrollBarVisibility="Visible" DataFetchSize="10" IncrementalLoadingTrigger="Edge" 
              IncrementalLoadingThreshold="2" ShowsScrollingPlaceholders="True" BorderThickness="1" IsItemClickEnabled="False" SelectionMode="None" PointerEntered="ListViewControl_PointerEntered">
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Center"/>
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <ItemsStackPanel CacheLength="0" Orientation="Vertical" Background="White" PointerWheelChanged="Grid_PointerWheelChanged"/>
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>

    </ListView>


</Grid>

и код позади (пока не сделано, просто пытаясь заставить его работать):

    private  void ItemsStackPanel_PointerWheelChanged(object sender, PointerRoutedEventArgs e)
    {
        e.Handled = true;

       
        PointerPoint pointerPoint = e.GetCurrentPoint(ListViewControl);

        
        float scrolledDistance = pointerPoint.Properties.MouseWheelDelta;

   
        if (scrolledDistance >=120)
        {
            //Load Page above current Page at a certain mousewheel point

        }
        else if (scrolledDistance <= -120 )
        {
            //Load Page below current Page at certain mousewheel point
        }
        else
        {
            //do some other stuff
        }
    }

1 Ответ

0 голосов
/ 03 августа 2020

По умолчанию ControlTemplate ListView содержит элемент управления ScrollViewer. PointerWheelChanged - событие относительно низкого уровня, которое будет перехвачено ScrollViewer.

Если вы хотите контролировать изменение расстояния прокрутки, PointerWheelChanged не рекомендуется. Вы можете прослушать событие ScrollViewer.ViewChanged и использовать ScrollViewer.VerticalOffset для определения расстояния вертикальной прокрутки.

Для этого мы можем создать собственный ListView:

CustomListView.cs

public class CustomListView:ListView
{
    private ScrollViewer _scrollViewer;

    public event EventHandler<ScrollViewerViewChangedEventArgs> ViewChanged;

    public CustomListView()
    {
        this.DefaultStyleKey = typeof(ListView);
    }

    protected override void OnApplyTemplate()
    {
        _scrollViewer = GetTemplateChild("ScrollViewer") as ScrollViewer;
        if (_scrollViewer != null)
        {
            _scrollViewer.ViewChanged += CustomViewChange;
        }
        base.OnApplyTemplate();
    }

    private void CustomViewChange(object sender, ScrollViewerViewChangedEventArgs e)
    {
        ViewChanged?.Invoke(sender, e);
    }
}

Использование

<controls:CustomListView x:Name="ListViewControl"
                         ViewChanged="ListViewControl_ViewChanged"
                         ...>
    <!--other content-->
</controls:CustomListView>
private void ListViewControl_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
{
    var scrollViewer = sender as ScrollViewer;
    double scrollHeight = scrollViewer.VerticalOffset;
    if (scrollHeight > 120)
    {
        //Do Something...
    }
    else
    {
        //Do something...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...