如何为ListBox创建不同的ItemsPanelTemplate

时间:2013-03-13 04:17:04

标签: c# wpf xaml

我正在Windows Phone 8上编写IM程序。我目前正在处理用于聊天的UI。 我想创建一个ListBox来保存所有“聊天气泡”(就像iPhone中的那些)。传入消息显示在左侧,传出消息显示在右侧。像这样:

enter image description here

很明显,我需要为每个项目设置不同的对齐

我试图通过将气泡包裹在一个Grid扩展ItemsPanel中的所有空间,并将聊天气泡向右对齐(聊天气泡的父级是大Grid)。但这不起作用,因为ItemsPanel中的网格不会自动填满所有空格。然后我去搜索“如何填写ItemsPanel中的所有空格”并且没有运气。

所以,我认为唯一的方法是为每个ItemsPanel设置不同的ItemsPanelTemplate,为“Right”或“Left”。

请帮帮我..谢谢!

那么如何为不同的ItemsPanelTemplate创建一个选择器呢?

2 个答案:

答案 0 :(得分:1)

您只需要自定义itemContainer:

<ItemsControl.ItemContainerStyle>
    <Style TargetType="ContentPresenter">
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsAnswer}" Value="True">
                <Setter Property="HorizontalAlignment" Value="Right"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</ItemsControl.ItemContainerStyle>

如果你没有样式触发器,你可以使用绑定和bool到Horizo​​ntalAlignment转换器:

<ItemsControl.ItemContainerStyle>
    <Style TargetType="ContentPresenter">
        <Setter Property="HorizontalAlignment" Value="{Binding IsAnswer,Converter={StaticResource AlignmentConverter}}"/>
    </Style>
</ItemsControl.ItemContainerStyle>

答案 1 :(得分:0)

您只需要2个查看您的邮件DataTemplate

一个MyMsg和一个Answer来自Message类或接口(您的决定)让我们称之为Msg

因此您可以将ItemsSource设置为List<Msg>ObservableCollection<Msg>并完成