Я пытаюсь создать страницу чата, где сообщения располагаются с левой стороны (конверсия) или с правой стороны (пользователь). Итак, я буду использовать селектор шаблонов данных и представление списка/коллекции для хранения сообщений. Все работает нормально, если я использую представление «Ярлык» по умолчанию, но если я изменю его на свой собственный рендерер «Ярлык», он больше не работает.
Вот мой код для пользовательского средства визуализации «Ярлык».
CustomLabel.cs в общей папке
public class CustomLabel : Label
{
public static readonly BindableProperty MaxWidthProperty = BindableProperty.Create(nameof(MaxWidth), typeof(int), typeof(CustomLabel));
public int MaxWidth
{
get { return (int)GetValue(MaxWidthProperty); }
set { SetValue(MaxWidthProperty, value); }
}
}
CustomLabelRenderer.cs в Android
public class CustomLabelRenderer : LabelRenderer
{
public CustomLabelRenderer(Context context) : base(context)
{
AutoPackage = false;
}
protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
{
base.OnElementChanged(e);
if (Context != null)
{
var view = ((CustomLabel)Element);
Control.SetMaxWidth(view.MaxWidth);
}
}
}
Вот мой код для селектора шаблона данных в словаре ресурсов и изображения результата. Для использования пользовательской метки я просто заменил «Label» на «local: CustomLabel».
Использование ярлыка
<ResourceDictionary>
<DataTemplate x:Key = "leftSideTemplate" x:DataType = "model:Message">
<ViewCell>
<Label Text = "{Binding Text}"
HorizontalTextAlignment = "Start"
HorizontalOptions = "StartAndExpand"
BackgroundColor = "{StaticResource BgColorSecondaryUser}"/>
</ViewCell>
</DataTemplate>
<DataTemplate x:Key = "rightSideTemplate" x:DataType = "model:Message">
<ViewCell>
<Label Text = "{Binding Text}"
HorizontalTextAlignment = "End"
HorizontalOptions = "EndAndExpand"
BackgroundColor = "{StaticResource BgColorPrimaryUser}"/>
</ViewCell>
</DataTemplate>
<dt:ConversationTemplateSelector x:Key = "conversationPageTemplateSelector"
LeftSideTemplate = "{StaticResource leftSideTemplate}" RightSideTemplate = "{StaticResource rightSideTemplate}"/>
</ResourceDictionary>
Поставьте точку останова на строку, где вы установили maxwidth. Это 0? Возможно, нужно пропустить эту строку, когда 0.
@ToolmakerSteve Да!! Спасибо, вы правы. Я должен был добавить условие, при котором элемент управления будет выполнять SetMaxWidth только тогда, когда view.MaxWidth больше 0, поскольку 0 является значением по умолчанию. Пожалуйста, опубликуйте свой ответ, чтобы я мог отметить его как правильный ответ.





Только SetMaxWidth, когда свойство MaxWidth представления больше 0. В противном случае элемент управления может иметь нулевую ширину, поэтому ничего не видно:
if (view.MaxWidth > 0)
Control.SetMaxWidth(view.MaxWidth);
Вы убедились, что пользовательский рендерер работает в ситуации Любые? Я имею в виду, прежде чем тестировать сложную ситуацию, вы сделали простую страницу с меткой и видели, как она там работает?