#listview #xamarin.forms #chat
#listview #xamarin.forms #Чат
Вопрос:
Я внедрил пользовательский интерфейс чата в свой проект. Отправленные сообщения отображаются с левой стороны, а полученные сообщения отображаются с правой стороны.
Для отображения сообщений с левой и правой стороны я создал новую переменную в классе модели, как показано ниже:
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;
}
Эта функция работает нормально при начальной загрузке сообщений. Когда я отправляю новое сообщение, выравнивание нарушается. Некоторые сообщения перемещаются влево, а некоторые — вправо. Если я нажму на редактор после отправки нового сообщения, возникнут проблемы с выравниванием. Не знаю, в чем реальная проблема, стоящая за этим.
Я загрузил пример проекта здесь.
Кроме того, здесь есть одно видео для записи экрана.
Комментарии:
1. вы не добавили видео
2. вы должны использовать селектор шаблонов данных docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals /…
3. добавлена ссылка на видео @ShubhamTyagi. Как я могу исправить эту проблему с помощью селектора шаблонов данных?
4. @Sreejith Sree Я заметил, что ваш образец содержит ваш личный адрес запроса. Я не буду загружать его из-за политики безопасности. Вам лучше удалить его и создать новый образец со статическими данными. Поэтому я могу предоставить вам только фрагмент кода.
Ответ №1:
Согласен с @ Shubham Tyagi . В вашем случае вы могли бы использовать DataTemplateSelector .
в коде создайте пользовательский 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;
}
}
}
в Xaml
//...
<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;
}