Arhn - архитектура программирования

Создание адаптивного макета с помощью RelativePanel и VisualStateManager

Я пытаюсь использовать VisualStateManager внутри пользовательского элемента управления, встроенного в панель просмотра. но с приведенным ниже кодом не работает, несмотря на то, что он действительно похож на тот, который упомянут в Building адаптивный макет с RelativePanel

   <UserControl
        x:Class="JintekiArchives.Views.CardDetailsControl"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:JintekiArchives"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        d:DesignHeight="300"
        d:DesignWidth="400">

        <Grid>
            <VisualStateManager.VisualStateGroups>
                <VisualStateGroup x:Name="AdaptiveVisualStateGroup">
                    <VisualState x:Name="VisualStateNarrow">
                        <VisualState.StateTriggers>
                            <AdaptiveTrigger MinWindowWidth="0" />
                        </VisualState.StateTriggers>
                        <VisualState.Setters>
                            <Setter Target="descriptionPanel.(RelativePanel.Below)" Value="imageBorder" />
                            <Setter Target="textPanel.(RelativePanel.Below)" Value="descriptionPanel" />
                        </VisualState.Setters>
                    </VisualState>
                    <VisualState x:Name="VisualStateNormal">
                        <VisualState.StateTriggers>
                            <AdaptiveTrigger MinWindowWidth="521" />
                        </VisualState.StateTriggers>
                        <VisualState.Setters>
                            <Setter Target="descriptionPanel.(RelativePanel.Below)" Value="imageBorder" />
                            <Setter Target="textPanel.(RelativePanel.Below)" Value="descriptionPanel" />
                        </VisualState.Setters>
                    </VisualState>
                    <VisualState x:Name="VisualStateWide">
                        <VisualState.StateTriggers>
                            <AdaptiveTrigger MinWindowWidth="1200" />
                        </VisualState.StateTriggers>
                        <VisualState.Setters>
                            <Setter Target="descriptionPanel.(RelativePanel.RightOf)" Value="imageBorder" />
                            <Setter Target="textPanel.(RelativePanel.RightOf)" Value="descriptionPanel" />
                        </VisualState.Setters>
                    </VisualState>
                </VisualStateGroup>
            </VisualStateManager.VisualStateGroups>

            <RelativePanel Margin="20">
                <RelativePanel.Background>
                    <ImageBrush x:Name="backgroundGrid" ImageSource="{Binding FactionImage}" Opacity="0.1" />
                </RelativePanel.Background>
                <StackPanel x:Name="titlePanel" Orientation="Horizontal" Margin="24"
                        RelativePanel.AlignTopWithPanel="True" 
                        RelativePanel.AlignLeftWithPanel="True" 
                        RelativePanel.AlignRightWithPanel="True">
                    <TextBlock FontSize="48" FontWeight="SemiBold" Text="{Binding Title}"></TextBlock>
                </StackPanel>
                <StackPanel Name="imageBorder" Width="300" Height="420" Margin="24, 24"
                        RelativePanel.Below="titlePanel" 
                        RelativePanel.AlignLeftWithPanel="True" 
                        RelativePanel.AlignRightWithPanel="false">
                    <Image Source="{Binding ImageSrc}" Stretch="None"/>
                </StackPanel>
                <StackPanel Name="descriptionPanel" Orientation="Vertical" Margin="24, 24"
                        RelativePanel.AlignTopWith="imageBorder" 
                        RelativePanel.RightOf="imageBorder">
                    <StackPanel Orientation="Horizontal" Margin="5">
                        <TextBlock>
                            <Run FontWeight="Bold" Text="Faction : "></Run>
                            <Run Text="{Binding Faction}"></Run>
                        </TextBlock>
                    </StackPanel>
                    <StackPanel Orientation="Horizontal" Margin="5">
                        <TextBlock>
                            <Run FontWeight="Bold" Text="Set : "></Run>
                            <Run Text="{Binding Set}"></Run>
                        </TextBlock>
                    </StackPanel>
                    <StackPanel Orientation="Horizontal" Margin="5">
                        <TextBlock>
                            <Run FontWeight="Bold" Text="Type : "></Run>
                            <Run Text="{Binding Type}"></Run>
                        </TextBlock>
                    </StackPanel>
                </StackPanel>
                <StackPanel Name="textPanel" Orientation="Vertical" Margin="24,24"
                        RelativePanel.AlignTopWith="imageBorder" 
                        RelativePanel.RightOf="descriptionPanel">
                    <StackPanel Orientation="Horizontal" Margin="5">
                        <TextBlock Width="600" TextWrapping="Wrap" TextTrimming="WordEllipsis" Text="{Binding Text}"></TextBlock>
                    </StackPanel>
                    <StackPanel Orientation="Horizontal" Margin="5">
                        <TextBlock Width="600" TextWrapping="Wrap" TextTrimming="WordEllipsis" FontStyle="Italic" Text="{Binding Flavor}">
                        </TextBlock>
                    </StackPanel>
                    <StackPanel Padding="5" Orientation="Horizontal" Margin="5">
                        <TextBlock>
                            <Run Text="Illustrated by "></Run>
                            <Run Text="{Binding Illustrator}"></Run>
                        </TextBlock>
                    </StackPanel>
                </StackPanel>
            </RelativePanel>
        </Grid>
    </UserControl>

Ответы:


1

Проблема здесь связана с Конфликтующие отношения с RelativePanel в макете.

Если вы установите несколько взаимосвязей, нацеленных на один и тот же край элемента, в результате у вас могут возникнуть конфликтующие взаимосвязи в макете. Когда это происходит, отношения применяются в следующем порядке приоритета:

Свойства выравнивания по центру панели (AlignVerticalCenterWith, AlignHorizontalCenterWithPanel, ...) обычно используются независимо от других ограничений и применяются при отсутствии конфликта.

HorizontalAlignment и Свойства VerticalAlignment к элементам пользовательского интерфейса применяются после оценки и применения свойств отношений. Эти свойства управляют размещением элемента в пределах доступного размера элемента, если требуемый размер меньше доступного размера.

Таким образом, приоритет AlignTopWith выше, чем Below. И в вашем коде вы установили RelativePanel.AlignTopWith в imageBorder в descriptionPanel и textPanel. Поэтому такие настройки, как descriptionPanel.(RelativePanel.Below) в VisualState, не будут работать.

Чтобы решить эту проблему, я предлагаю вам удалить прикрепленные свойства RelativePanel в ваших descriptionPanel и textPanel и просто установить эти прикрепленные свойства в VisualState, не используя AlignTopWith.

Поскольку я не уверен, какой у вас желаемый макет, здесь я просто использую, например, два визуальных состояния:

<VisualStateManager.VisualStateGroups>
    <VisualStateGroup x:Name="AdaptiveVisualStateGroup">
        <VisualState x:Name="VisualStateNarrow">
            <VisualState.StateTriggers>
                <AdaptiveTrigger MinWindowWidth="0" />
            </VisualState.StateTriggers>
            <VisualState.Setters>
                <Setter Target="descriptionPanel.(RelativePanel.Below)" Value="imageBorder" />
                <Setter Target="textPanel.(RelativePanel.Below)" Value="descriptionPanel" />
            </VisualState.Setters>
        </VisualState>
        <VisualState x:Name="VisualStateWide">
            <VisualState.StateTriggers>
                <AdaptiveTrigger MinWindowWidth="1200" />
            </VisualState.StateTriggers>
            <VisualState.Setters>
                <Setter Target="descriptionPanel.(RelativePanel.Below)" Value="titlePanel" />
                <Setter Target="descriptionPanel.(RelativePanel.RightOf)" Value="imageBorder" />
                <Setter Target="textPanel.(RelativePanel.Below)" Value="titlePanel" />
                <Setter Target="textPanel.(RelativePanel.RightOf)" Value="descriptionPanel" />
            </VisualState.Setters>
        </VisualState>
    </VisualStateGroup>
</VisualStateManager.VisualStateGroups>
19.04.2016
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..


© 2024 arhn.ru, Arhn - архитектура программирования