Получить флип-представление ItemsPresenter для отображения следующих и предыдущих элементов

У меня есть флип-просмотр uwp, и я хочу, чтобы он показывал немного следующего и предыдущего элементов. По сути, это означает, что каждый элемент прокрутки должен быть немного меньше, чтобы вы знали, что прокрутку можно прокручивать. Вот скриншот того, что у меня сейчас есть:

введите здесь описание изображения

Flipview — это часть с круглым изображением Майкла Фассбендера. Вы можете перейти к следующему, поэтому я хочу показать часть следующего изображения слева. Я заметил, что стиль FlipView по умолчанию имеет ItemsPresenter внутри средства просмотра прокрутки (мы можем изменить стиль FlipView по умолчанию, щелкнув его правой кнопкой мыши в Visual Studio/Редактировать стиль/Редактировать копию...). Если я установлю для поля этого ItemsPresenter значение -100 с каждой стороны, в некоторых точках это сработает, но поведение будет странным, непредсказуемым и зависит от ширины окна. Какое другое решение может быть?


person user2950509    schedule 22.06.2016    source источник


Ответы (1)


Если я установлю для поля этого ItemsPresenter значение -100 с каждой стороны, в некоторых точках это сработает, но поведение будет странным, непредсказуемым и зависит от ширины окна. Какое другое решение может быть?

Вы правы в установке Margin этого ItemsPresenter, но я думаю, что значение -100 не может решить проблему здесь, и оно должно зависеть от ширины FilpView, а не ширины окна. Здесь у меня есть решение, также устанавливающее свойство Margin:

<ItemsPresenter Margin="{Binding Width, RelativeSource={RelativeSource Mode=TemplatedParent}, Converter={StaticResource marginvct}}" />

А мой преобразователь такой:

public class MarginConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        var width = (double)value;
        double itemmargin = width / 6;
        Thickness margin = new Thickness(itemmargin, 0, itemmargin, 0);
        return margin;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

Как вы можете видеть из этого кода, я устанавливаю ширину каждого элемента в 2/3 от всей ширины FlipView и оставляю слева и справа пространство с 1/6 ширины FlipView, так что следующий, текущий и предыдущие элементы должны отображаться вместе.

А так как я привязываю значение Margin к Width, при использовании FlipView сейчас должно быть установлено свойство Width. Вы сказали, что это зависит от размера окна, я думаю, вы хотите, чтобы ширина вашего FlipView была равна ширине окна, поэтому, например, вы можете написать такой код:

<FlipView ItemsSource="{x:Bind collection}" Style="{StaticResource FlipViewStyle}" Width="{x:Bind CustomWidth}">
    <FlipView.ItemTemplate>
        <DataTemplate>
            <Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
                <Grid.Background>
                    <ImageBrush ImageSource="{Binding ContactImage}" />
                </Grid.Background>
                <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
                    <Ellipse Width="200" Height="200">
                        <Ellipse.Fill>
                            <ImageBrush ImageSource="{Binding ContactImage}" />
                        </Ellipse.Fill>
                    </Ellipse>
                    <TextBlock Margin="0,30,0,0" Text="{Binding ContactName}" FontSize="25" FontWeight="Bold" />
                    <TextBlock Margin="0,15,0,0" Text="{Binding ContactNumber}" FontSize="20" />
                    <TextBlock Margin="0,15,0,0" Text="{Binding ContactAddress}" FontSize="20" />
                </StackPanel>
            </Grid>
        </DataTemplate>
    </FlipView.ItemTemplate>
</FlipView>

Код для CustomWidth выглядит следующим образом:

private double CustomWidth;

public MainPage()
{
    this.InitializeComponent();
    CustomWidth = Window.Current.Bounds.Width;
}

Вот изображение рендеринга этой демонстрации: введите здесь описание изображения

person Grace Feng    schedule 23.06.2016
comment
Кажется, он по-прежнему странно реагирует на изменение размера: / Я устанавливаю размер флип-просмотра на ширину окна в событии Page SizeChanged. Я также получаю поведение, когда поля не всегда имеют одинаковую ширину: - person user2950509; 23.06.2016
comment
@user2950509 user2950509, я не смог воспроизвести вашу проблему, я не нашел здесь ничего странного с запасом. Но если установить ширину для flipview в событии SizeChanged страницы, вам нужно будет реализовать INotifypropertyChanged здесь, чтобы уведомить FlipView об изменении его ширины, и сначала также важно указать начальное значение ширины, иначе произойдет ошибка. А вы проверили мой ответ на последний вопрос? - person Grace Feng; 23.06.2016
comment
Я получаю такое поведение: imgur.com/vGEqdAo . Как видите, предметы также иногда исчезают. - person user2950509; 23.06.2016
comment
А что касается ширины, все, что я делаю, это устанавливаю ее следующим образом: flipview.Width = Window.Current.Bounds.Width; в событии SizeChanged страницы:/ - person user2950509; 23.06.2016
comment
@ user2950509, я думаю, что это нормально, что элемент исчезнет при изменении размера окна, потому что в это время значение поля всегда будет пересчитываться. И я все еще не мог воспроизвести вашу проблему с маржей при изменении размера, как вы установили маржу? - person Grace Feng; 23.06.2016
comment
Я использовал именно тот преобразователь, который вы указали, и привязал ItemsPresenter к стилю флипвью, используя Margin="{Binding Width, RelativeSource={RelativeSource Mode=TemplatedParent}, Converter={StaticResource marginvct}}" /> . Я думаю, что проблема с полями может быть связана с тем, что фотография не растягивается до ширины FlipView. Это фиксированный размер (175x175). - person user2950509; 23.06.2016
comment
@ user2950509, я использовал изображения в качестве ImageBrush, чтобы заполнить фиксированный размер эллипса, этой проблемы не возникнет. Как вы получили круглое изображение? Является ли источник изображения уже круглым? - person Grace Feng; 23.06.2016
comment
Круглое изображение представляет собой прямоугольник 175x175 с радиусом X и радиусом Y, установленным на 88. Это мой xaml: pastebin.com/3iwUP8nH, а это C#: pastebin.com/9VJfS6G9 . FlipViewStyle — обычный, а ItemsPresenter переключился на это: <ItemsPresenter Margin="{Binding Width, RelativeSource={RelativeSource Mode=TemplatedParent}, Converter={StaticResource marginvct}}"/> - person user2950509; 23.06.2016
comment
@user2950509 user2950509, я протестировал ваш код, я все еще не могу воспроизвести ваше странное поведение, если только не использую цель VisualStateManager в ItemPresenter.Margin в стиле или не устанавливаю статическое значение для поля. Вы пользовались этими методами? И мы должным образом обсудили слишком много под этим ответом. - person Grace Feng; 24.06.2016