Я реализовал пользовательский интерфейс чата в своем проекте. Отправленные сообщения отображаются слева, а полученные сообщения отображаются справа.
Для отображения сообщений слева и справа я создал новую переменную в классе модели, как показано ниже:
private LayoutOptions horizontalOptions;
public LayoutOptions HorizontalOptions
{
get => horizontalOptions;
set
{
horizontalOptions = value;
NotifyPropertyChanged(nameof(horizontalOptions));
}
}
Основываясь на значении имени пользователя, я установил значение HorizontalOptions
, как показано ниже:
string myUsername = "myusername";
string tweetUser = username in the message;
if (myUsername == tweetUser)
{
tweet.HorizontalOptions = LayoutOptions.StartAndExpand;
}
else
{
tweet.HorizontalOptions = LayoutOptions.EndAndExpand;
}
Эта функция работает нормально при начальной загрузке сообщений. Когда я отправляю новое сообщение, выравнивание нарушается. Некоторые сообщения перемещаются влево, а некоторые вправо. Если я коснусь редактора после отправки нового сообщения, возникнут проблемы с выравниванием. Не знаю, какая реальная проблема стоит за этим.
Я загрузил пример проекта здесь.
Также, одно видео записи экрана здесь.
вам следует использовать селектор шаблонов данных learn.microsoft.com/en-us/xamarin/xamarin-forms/…
Добавлена ссылка на видео @ShubhamTyagi. Как я могу решить эту проблему с помощью селектора шаблонов данных?
@Sreejith Sree Я заметил, что ваш образец содержит ваш личный адрес запроса. Я не буду его скачивать из-за политики безопасности. Вам лучше удалить его и создать новый образец со статическими данными. Поэтому я могу предоставить вам только фрагмент кода.
Согласен с @Shubham Tyagi. Вы можете использовать DataTemplateSelector в вашем случае.
public class ChatDataTemplateSelector : DataTemplateSelector
{
public DataTemplate ReceiveTemplate { get; set; }
public DataTemplate SendTemplate { get; set; }
protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
{
var obj = item as YourModel;
string myUsername = "henry.pinto";
string tweetUser = obj.tweetUser;
if (myUsername == tweetUser)
{
return SendTemplate;
}
else
{
return ReceiveTemplate;
}
}
}
//...
<ContentPage.Resources>
<ResourceDictionary>
<DataTemplate x:Key = "ReceiveTemplate">
<ViewCell>
<Frame
FlowDirection = "LeftToRight"
Rotation = "180"
Padding = "8"
Margin = "0,8,0,8"
CornerRadius = "5"
HasShadow = "False"
BorderColor = "#f3db92"
BackgroundColor = "#fdebb6"
HorizontalOptions = "EndAndExpand"
VerticalOptions = "CenterAndExpand">
<Label
Text = "{Binding tweetData}"
x:Name = "tweetData"
TextColor = "Black"
HorizontalOptions = "Start"
VerticalOptions = "Center">
</Label>
</Frame>
</ViewCell>
</DataTemplate>
<DataTemplate x:Key = "SendTemplate">
<ViewCell>
<Frame
FlowDirection = "LeftToRight"
Rotation = "180"
Padding = "8"
Margin = "0,8,0,8"
CornerRadius = "5"
HasShadow = "False"
BorderColor = "Blue"
BackgroundColor = "LightBlue"
HorizontalOptions = "StartAndExpand"
VerticalOptions = "CenterAndExpand">
<Label
Text = "{Binding tweetData}"
x:Name = "tweetData"
TextColor = "Black"
HorizontalOptions = "Start"
VerticalOptions = "Center">
</Label>
</Frame>
</ViewCell>
</DataTemplate>
<local:ChatDataTemplateSelector x:Key = "ChatDataTemplateSelector"
ReceiveTemplate = "{StaticResource ReceiveTemplate}"
SendTemplate = "{StaticResource SendTemplate}" />
</ResourceDictionary>
</ContentPage.Resources>
<StackLayout
Orientation = "Vertical"
HorizontalOptions = "FillAndExpand">
<ListView
ItemsSource = "{Binding xxx}"
//...
ItemTemplate = "{StaticResource ChatDataTemplateSelector}"
>
<ListView.Footer>
<Label/>
</ListView.Footer>
</ListView>
</StackLayout>
</ContentPage>
И вы можете удалить свойство, такое как BgColor и BorderColor, в модели. И удалите следующий код
string myUsername = "myusername";
string tweetUser = username in the message;
if (myUsername == tweetUser)
{
tweet.HorizontalOptions = LayoutOptions.StartAndExpand;
}
else
{
tweet.HorizontalOptions = LayoutOptions.EndAndExpand;
}
ты не добавил видео