Универсальное приложение ListView Item HorizontalAlignment

Я хотел бы создать ListView, который имеет элементы, выровненные по правому краю, а также по левому краю. Пока что во всех моих попытках с DataTemplates и ItemContainerStyles мне не удалось заставить это работать. Выравнивание по левому краю работает нормально, поскольку это значение по умолчанию, но я не могу понять, как выровнять некоторые элементы по правому краю. Например, это будет похоже на представление типа чата / разговора, такое как приложение для обмена сообщениями Windows Phone.

Мой текущий XAML выглядит так:

<Page
x:Class="MDControl.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MDControl"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">

<Page.Resources>
    <CollectionViewSource x:Name="Messages" Source="{Binding mMessages}"/>

    <DataTemplate x:Key="SentMessageTemplate">
        <StackPanel Padding="10" Margin="5" Background="Teal" HorizontalAlignment="Right" Width="Auto">
            <TextBlock Text="{Binding MessageType}" FontWeight="Bold" TextWrapping="NoWrap" Foreground="White"/>
            <TextBlock Text="{Binding MessageBody}" TextWrapping="Wrap" Foreground="White" />
            <TextBlock Text="{Binding Timestamp}" TextWrapping="NoWrap" Foreground="White" FontStyle="Italic" FontSize="12"/>
        </StackPanel>
    </DataTemplate>

    <DataTemplate x:Key="ReceivedMessageTemplate">
        <StackPanel Padding="10" Margin="5" Background="LightGray">
            <TextBlock Text="{Binding MessageType}" FontWeight="Bold" TextWrapping="NoWrap"/>
            <TextBlock Text="{Binding MessageBody}" TextWrapping="Wrap"/>
            <TextBlock Text="{Binding Timestamp}" TextWrapping="NoWrap" TextAlignment="Right" FontStyle="Italic" FontSize="12"/>
        </StackPanel>
    </DataTemplate>

    <Style TargetType="ListViewItem" x:Key="SentMessageStyle">
        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    </Style>

    <Style TargetType="ListViewItem" x:Key="ReceivedMessageStyle">
        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    </Style>

    <local:MessageListTemplateSelector x:Key="MessageListTemplateSelector"
        SentMessageTemplate="{StaticResource SentMessageTemplate}"
        ReceivedMessageTemplate="{StaticResource ReceivedMessageTemplate}">
    </local:MessageListTemplateSelector>

    <local:MessageListContainerStyleSelector x:Key="MessageListContainerStyleSelector"
        SentMessageStyle="{StaticResource SentMessageStyle}"
        ReceivedMessageStyle="{StaticResource ReceivedMessageStyle}">
    </local:MessageListContainerStyleSelector>
</Page.Resources>

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <ListView x:Name="messageList" ScrollViewer.VerticalScrollBarVisibility="Visible" ItemContainerStyleSelector="{StaticResource MessageListContainerStyleSelector}" ItemsSource="{Binding Source={StaticResource Messages}}" ItemTemplateSelector="{StaticResource MessageListTemplateSelector}" Margin="10,120,10,50" VerticalAlignment="Bottom" IsDoubleTapEnabled="False"/>
</Grid>

What can I change to get the "Sent" messages to be right aligned? Currently they show up with a Teal background which I want, but they are still Left aligned instead of Right. I am a little new to XAML, so forgive me if I'm way off here.

ОБНОВЛЕНИЕ: решение

Сетки были ключевым моментом, мне пришлось использовать несколько сеток для достижения правильного выравнивания по правому краю в сочетании с ItemContainerStyle установкой HorizontalContentAlignment.

<Page
x:Class="MDControl.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MDControl"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">

<Page.Resources>
    <CollectionViewSource x:Name="Messages" Source="{Binding mMessages}"/>

    <DataTemplate x:Key="SentMessageTemplate">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Grid Height="Auto" Grid.Row="1" Margin="5" HorizontalAlignment="Right">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <StackPanel Padding="10" Background="Teal">
                    <TextBlock Text="{Binding MessageType}" FontWeight="Bold" TextWrapping="NoWrap" Foreground="White" />
                    <TextBlock Text="{Binding MessageBody}" TextWrapping="Wrap" Foreground="White" />
                    <TextBlock Text="{Binding Timestamp}" TextWrapping="NoWrap" Foreground="White" FontStyle="Italic" FontSize="12" HorizontalAlignment="Right"/>
                </StackPanel>
            </Grid>
        </Grid>
    </DataTemplate>

    <DataTemplate x:Key="ReceivedMessageTemplate">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Grid Height="Auto" Grid.Row="1" Margin="5" HorizontalAlignment="Left">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <StackPanel Padding="10" Background="LightGray">
                    <TextBlock Text="{Binding MessageType}" FontWeight="Bold" TextWrapping="NoWrap" />
                    <TextBlock Text="{Binding MessageBody}" TextWrapping="Wrap" />
                    <TextBlock Text="{Binding Timestamp}" TextWrapping="NoWrap" FontStyle="Italic" FontSize="12" HorizontalAlignment="Right"/>
                </StackPanel>
            </Grid>
        </Grid>
    </DataTemplate>

    <local:MessageListTemplateSelector x:Key="MessageListTemplateSelector"
        SentMessageTemplate="{StaticResource SentMessageTemplate}"
        ReceivedMessageTemplate="{StaticResource ReceivedMessageTemplate}">
    </local:MessageListTemplateSelector>
</Page.Resources>

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <ListView x:Name="messageList" ScrollViewer.VerticalScrollBarVisibility="Visible" ItemsSource="{Binding Source={StaticResource Messages}}" ItemTemplateSelector="{StaticResource MessageListTemplateSelector}" Margin="10,120,10,50" VerticalAlignment="Bottom" IsDoubleTapEnabled="False">
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            </Style>
        </ListView.ItemContainerStyle>
    </ListView>
</Grid>


person nverbeek    schedule 01.06.2015    source источник


Ответы (2)


Проблема в ваших DataTemplate, а не в стилях и т. Д. Для этого вы должны использовать Grid вместо Stackpanel в DataTemplate.

Стеклопанели не будут растягиваться до родительского элемента. Они получат только ширину / высоту всех элементов управления внутри него.

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
person Burak Kaan Köse    schedule 02.06.2015
comment
Спасибо! Это не привело меня к этому, но позволило мне пойти по правильному пути. Отредактировал исходный пост с полным решением. - person nverbeek; 02.06.2015

Вы должны использовать свойство HorizontalAlignment, которое определяет положение элемента внутри родительского элемента .<Grid x:Name="simpleGrid" height = 50 width = 100 HorizontalAlignment="right" />

person Dedralus    schedule 01.06.2015
comment
Я использую HorizontalAlignment="Right" в SentMessageTemplate в предоставленном мной примере кода. Я тоже пробовал это в SentMessageStyle. Ни то, ни другое не работает. Не могли бы вы уточнить, где, по вашему мнению, я должен это устанавливать? - person nverbeek; 02.06.2015