UWP IScrollSnapPointsInfo - PullRequest
       43

UWP IScrollSnapPointsInfo

0 голосов
/ 13 июня 2018

enter image description here Я хочу создать пользовательскую панель с реализацией IScrollSnapPointsInfo, я устанавливаю snapoffset на 500px, я хочу прослушивать событие для каждого изменения 500px, в настоящее время япрослушивание события «HorizontalSnapPointsChanged», но не уверен, как вызывать его при каждом изменении 500px.Пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 28 июня 2018

У меня есть панель шириной, скажем, 1 * 10 ^ 6, у меня есть 21 сетка (один день), мне нужно организовать 21 день на панели, когда я прокручиваю влево, 1-я сетка должна бытьперешел к последней вицеверсе, так что это дает эффект бесконечной прокрутки.И при прокрутке, мне нужно привязать вид, например, если ширина одного дня составляет 500 пикселей, то весь день должен перемещаться по одной прокрутке.Надеюсь, это ясно объясняет, пожалуйста, предложите мне идеи по этому поводу.

Использование IScrollSnapPointsInfo - это путь для создания пользовательских панелей.Реализация используется, когда панель помещается непосредственно в ScrollViewer (scrollViewer.Content == панель) или когда это ItemsPanel ItemsControl.

Я сделал пример кода для вашего.Это должно быть хорошей отправной точкой для вас.

<ScrollViewer HorizontalScrollMode="Enabled" HorizontalScrollBarVisibility="Hidden" HorizontalSnapPointsAlignment="Center" HorizontalSnapPointsType="MandatorySingle" VerticalScrollMode="Disabled">
        <local:CustomPanel HorizontalSnapPointsChanged="CustomPanel_HorizontalSnapPointsChanged">
            <Grid  Height="200" Width="500" Background="Black" BorderBrush="Red" BorderThickness="1 1 1 1">
                <TextBlock Text="1" FontSize="100" Foreground="Yellow"></TextBlock>
            </Grid>
            <Grid  Height="200" Width="500" Background="Black" BorderBrush="Red" BorderThickness="1 1 1 1">
                        <TextBlock Text="2" FontSize="100" Foreground="Yellow"></TextBlock>
                    </Grid>
            <Grid  Height="200" Width="500" Background="Black" BorderBrush="Red" BorderThickness="1 1 1 1">
                        <TextBlock Text="3" FontSize="100" Foreground="Yellow"></TextBlock>
                    </Grid>
            <Grid  Height="200" Width="500" Background="Black" BorderBrush="Red" BorderThickness="1 1 1 1">
                        <TextBlock Text="4" FontSize="100" Foreground="Yellow"></TextBlock>
                    </Grid>
            <Grid  Height="200" Width="500" Background="Black" BorderBrush="Red" BorderThickness="1 1 1 1">
                        <TextBlock Text="5" FontSize="100" Foreground="Yellow"></TextBlock>
                    </Grid>
            <Grid  Height="200" Width="500" Background="Black" BorderBrush="Red" BorderThickness="1 1 1 1">
                        <TextBlock Text="6" FontSize="100" Foreground="Yellow"></TextBlock>
                    </Grid>
            <Grid  Height="200" Width="500" Background="Black" BorderBrush="Red" BorderThickness="1 1 1 1">
                        <TextBlock Text="7" FontSize="100" Foreground="Yellow"></TextBlock>
                    </Grid>
            <Grid  Height="200" Width="500" Background="Black" BorderBrush="Red" BorderThickness="1 1 1 1">
                        <TextBlock Text="8" FontSize="100" Foreground="Yellow"></TextBlock>
                    </Grid>
            <Grid  Height="200" Width="500" Background="Black" BorderBrush="Red" BorderThickness="1 1 1 1">
                        <TextBlock Text="9" FontSize="100" Foreground="Yellow"></TextBlock>
                    </Grid>
            <Grid  Height="200" Width="500" Background="Black" BorderBrush="Red" BorderThickness="1 1 1 1">
                        <TextBlock Text="10" FontSize="100" Foreground="Yellow"></TextBlock>
                    </Grid>
            <Grid  Height="200" Width="500" Background="Black" BorderBrush="Red" BorderThickness="1 1 1 1">
                        <TextBlock Text="11" FontSize="100" Foreground="Yellow"></TextBlock>
                    </Grid>
            <Grid  Height="200" Width="500" Background="Black" BorderBrush="Red" BorderThickness="1 1 1 1">
                        <TextBlock Text="12" FontSize="100" Foreground="Yellow"></TextBlock>
                    </Grid>
            <Grid  Height="200" Width="500" Background="Black" BorderBrush="Red" BorderThickness="1 1 1 1">
                        <TextBlock Text="13" FontSize="100" Foreground="Yellow"></TextBlock>
                    </Grid>
            <Grid  Height="200" Width="500" Background="Black" BorderBrush="Red" BorderThickness="1 1 1 1">
                        <TextBlock Text="14" FontSize="100" Foreground="Yellow"></TextBlock>
                    </Grid>
            <Grid  Height="200" Width="500" Background="Black" BorderBrush="Red" BorderThickness="1 1 1 1">
                        <TextBlock Text="15" FontSize="100" Foreground="Yellow"></TextBlock>
                    </Grid>
            <Grid  Height="200" Width="500" Background="Black" BorderBrush="Red" BorderThickness="1 1 1 1">
                        <TextBlock Text="16" FontSize="100" Foreground="Yellow"></TextBlock>
                    </Grid>
            <Grid  Height="200" Width="500" Background="Black" BorderBrush="Red" BorderThickness="1 1 1 1">
                        <TextBlock Text="17" FontSize="100" Foreground="Yellow"></TextBlock>
                    </Grid>
            <Grid  Height="200" Width="500" Background="Black" BorderBrush="Red" BorderThickness="1 1 1 1">
                        <TextBlock Text="18" FontSize="100" Foreground="Yellow"></TextBlock>
                    </Grid>
            <Grid  Height="200" Width="500" Background="Black" BorderBrush="Red" BorderThickness="1 1 1 1">
                        <TextBlock Text="19" FontSize="100" Foreground="Yellow"></TextBlock>
                    </Grid>
            <Grid  Height="200" Width="500" Background="Black" BorderBrush="Red" BorderThickness="1 1 1 1">
                        <TextBlock Text="20" FontSize="100" Foreground="Yellow"></TextBlock>
                    </Grid>
            <Grid  Height="200" Width="500" Background="Black" BorderBrush="Red" BorderThickness="1 1 1 1">
                        <TextBlock Text="21" FontSize="100" Foreground="Yellow"></TextBlock>
                    </Grid>
        </local:CustomPanel>
    </ScrollViewer>
public class CustomPanel:Panel, IScrollSnapPointsInfo
{
    private float horizontalRegularSnapPointsInterval;
    private float verticalRegularSnapPointsInterval;



    public CustomPanel()
    {
        horizontalRegularSnapPointsInterval = 500f;
        verticalRegularSnapPointsInterval = 35f;
    }

    double x = 0;
    double y = 0;

    protected override Size ArrangeOverride(Size finalSize)
    {
        foreach (UIElement child in Children)
        {
            child.Arrange(new Rect(x, y, child.DesiredSize.Width, child.DesiredSize.Height));
            x = x + child.DesiredSize.Width;

        }
        x = 0;
        return finalSize;
    }

    protected override Size MeasureOverride(Size availableSize)
    {
        Size size = new Size(0, 0);

        foreach (UIElement child in Children)
        {
            child.Measure(availableSize);

        }

        size.Width = double.IsPositiveInfinity(availableSize.Width) ?
           500*21 : availableSize.Width;

        size.Height = double.IsPositiveInfinity(availableSize.Height) ?
           200 : availableSize.Height;

        return size;
    }



    public IReadOnlyList<float> GetIrregularSnapPoints(Orientation orientation, SnapPointsAlignment alignment)
    {
        // Returning null because the exposed snap points are regular instead of irregular. 
        return null;
    }

    public float GetRegularSnapPoints(Orientation orientation, SnapPointsAlignment alignment, out float offset)
    {
        offset = 0f;

        if (orientation == Orientation.Horizontal)
        {
            switch (alignment)
            {
                case SnapPointsAlignment.Near:
                    offset = (float)Margin.Left;
                    break;
                case SnapPointsAlignment.Center:
                    offset = horizontalRegularSnapPointsInterval / 2f + (float)Margin.Left;
                    break;
                case SnapPointsAlignment.Far:
                    offset = (float)Margin.Right;
                    break;
            }
            return horizontalRegularSnapPointsInterval;
        }
        else
        {
            switch (alignment)
            {
                case SnapPointsAlignment.Near:
                    offset = (float)Margin.Top;
                    break;
                case SnapPointsAlignment.Center:
                    offset = verticalRegularSnapPointsInterval / 2f + (float)Margin.Top;
                    break;
                case SnapPointsAlignment.Far:
                    offset = (float)Margin.Bottom;
                    break;
            }
            return verticalRegularSnapPointsInterval;
        }
    }

    public bool AreHorizontalSnapPointsRegular
    {
        get
        {
            return true;
        }
    }

    public bool AreVerticalSnapPointsRegular
    {
        get
        {
            return true;
        }
    }

    public event EventHandler<object> HorizontalSnapPointsChanged;
    public event EventHandler<object> VerticalSnapPointsChanged;

    // Invoke when the regular interval for the horizontal snap points changes
    private void UpdateHorizontalRegularSnapPointsInterval(float interval)
    {
        if (interval != horizontalRegularSnapPointsInterval)
        {
            horizontalRegularSnapPointsInterval = interval;
            RaiseHorizontalSnapPointsChanged();
        }
    }

    // Invoke when the regular interval for the vertical snap points changes
    private void UpdateVerticalRegularSnapPointsInterval(float interval)
    {
        if (interval != verticalRegularSnapPointsInterval)
        {
            verticalRegularSnapPointsInterval = interval;
            RaiseVerticalSnapPointsChanged();
        }
    }

    private void RaiseHorizontalSnapPointsChanged()
    {
        HorizontalSnapPointsChanged?.Invoke(this, null);
    }

    private void RaiseVerticalSnapPointsChanged()
    {
        VerticalSnapPointsChanged?.Invoke(this, null);
    }
}
...