我昨天发布了一个问题,但我认为我没有正确解释它。
让我再尝试一次。
所以这是我的目标:
红色气泡代表传入消息,蓝色气泡代表传出消息。我可以使用以下 xaml 代码更准确地描述这一点。请注意,以下代码只是对我的实际 xaml 代码(带有一些 DataTemplates)编译时我期望得到的结果的解释(WPF 将使用 DataTemplates 自动为我填充数据)。:
<ListBox>
<ListBoxItem HorizontalAlignment="Right">
<Grid Background="Blue">
<TextBlock Text="Help me please!" FontSize="30"/>
</Grid>
</ListBoxItem>
<ListBoxItem HorizontalAlignment="Left">
<Grid Background="Red">
<TextBlock Text="What do you want?" FontSize="30"/>
</Grid>
</ListBoxItem>
<ListBoxItem HorizontalAlignment="Right">
<Grid Background="Blue">
<TextBlock Text="I want a ListBox" FontSize="30"/>
</Grid>
</ListBoxItem>
<ListBoxItem HorizontalAlignment="Left">
<Grid Background="Red">
<TextBlock Text="Then?" FontSize="30"/>
</Grid>
</ListBoxItem>
<ListBoxItem HorizontalAlignment="Right">
<Grid Background="Blue">
<TextBlock Text="But the Grid won't fill" FontSize="30"/>
</Grid>
</ListBoxItem>
</ListBox>
为了实现这一点,我写道:
<ListBox>
<ListBox.ItemTemplate>
<DataTemplate>
<ListBoxItem>
<Grid Background="{Binding Color}">
<TextBlock Text="{Binding Text}" FontSize="30"/>
</Grid>
</ListBoxItem>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
请注意,上面的代码中没有指定对齐方式,因为我真的不知道如何使用模板分别为 ListBoxItem 设置不同的对齐方式。所以这会导致默认情况下所有蓝色和红色网格都向左对齐。
我的第一种方法包括一个数据模板选择器(传入消息的模板被省略):
<ListBox>
<ListBox>
<ListBox.ItemTemplate>
<!-- local:MessageBubbleTemplateSelector.OutgoingMessageTemplate -->
<DataTemplate>
<ListBoxItem>
<Grid>
<Grid Background="{Binding Color}" HorizontalAlignment="Right">
<TextBlock Text="{Binding Text}" FontSize="30"/>
</Grid>
</Grid>
</ListBoxItem>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</ListBox>
但这没有用。因为Grid
包裹语音气泡的那个不会自动膨胀,所以Grid
里面的对齐Grid
没关系(紧密贴合)。
然后我去搜索如何在 aGrid
内部扩展 a StackPanel
,但没有运气。
经过数小时的谷歌搜索和反复试验,我决定为ItemsPanelTemplate
自己定义模板。我的Message
对象中有一个属性,可以帮助我区分传入消息和传出消息。但我不知道如何创建ItemsPanelTemplate
选择器(作为记录,谷歌告诉我Style.Trigger
Windows Phone 8 不支持)。
所以我的问题是:如何设置不同的 HorizontalAlignment ListBoxItems
?
顺便说一句,ItemsPabelTemplate
看起来像这样:
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
非常感谢您的耐心等待。我已经在这里疯狂绝望了......浪费了这么多时间......