C# 如何为列表框创建不同的ItemsPanelTemplate

C# 如何为列表框创建不同的ItemsPanelTemplate,c#,wpf,xaml,C#,Wpf,Xaml,我正在WindowsPhone8上写一个即时通讯程序。我现在正在处理聊天的UI。 我想创建一个列表框,其中包含所有的“聊天泡泡”(如iPhone中的泡泡)。传入消息显示在左侧,传出消息显示在右侧。像这样: 显然,我需要为每个项目设置不同的对齐方式 我试图通过在一个大的网格中包装气泡来解决这个问题,该网格扩展了ItemsPanel中的所有空间,并将聊天气泡向右对齐(聊天气泡的父级是大的网格)。但这不起作用,因为ItemsPanel中的网格不会自动填充所有空间。然后我去搜索“如何填充ItemsPa

我正在WindowsPhone8上写一个即时通讯程序。我现在正在处理聊天的UI。 我想创建一个
列表框
,其中包含所有的“聊天泡泡”(如iPhone中的泡泡)。传入消息显示在左侧,传出消息显示在右侧。像这样:

显然,我需要为每个项目设置不同的对齐方式

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

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

请帮帮我。。谢谢大家!


那么,如何为不同的
ItemsPanelTemplate
创建选择器呢

您的消息只需要两个视图,即
DataTemplate

一个用于
MyMsg
,另一个用于
Answer
,这两个选项都来自消息类或接口(您的决定),让我们称之为
Msg


因此,您可以将
项目资源
设置为
列表
可观察收集
,这样您就完成了

您的消息只需要两个视图,即
数据模板

一个用于
MyMsg
,另一个用于
Answer
,这两个选项都来自消息类或接口(您的决定),让我们称之为
Msg


因此,您可以将
itemsource
设置为
List
observedcollection
,这样就完成了您只需要自定义itemscontainer:

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

如果没有样式触发器,可以使用绑定和布尔到水平对齐转换器:

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

您只需自定义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>

如果没有样式触发器,可以使用绑定和布尔到水平对齐转换器:

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


如果您有一个区分每个项目类型的属性,则可以对该属性值使用数据触发器。你可以将一个触发器设置为左对齐,另一个设置为右对齐。但是,样式触发器在Windows Phone 7或8应用程序中不再可用。如果您有区分每种项目类型的属性,则可以对该属性值使用数据触发器。你可以将一个触发器设置为左对齐,另一个设置为右对齐。但是样式触发器在Windows Phone 7或8应用程序中不再可用。谢谢,但它不起作用,因为样式触发器在Windows Phone中不可用。是否有任何等效或替代方法?谢谢,但它不起作用,因为样式触发器在Windows Phone中不可用。是否有任何等效或替代方法?