Невозможно очистить TextDecoration в приложении Xamarin Forms UWP
Используя Xamarin Forms (версия 2.5.0.121934), я работаю над приложением, ориентированным на Android, iOS и UWP. Мне нужно добавить подчеркивание и зачеркивание к некоторому тексту, который требует пользовательских средств визуализации. Для Android и iOS все работает нормально, а в UWP применение зачеркивания или подчеркивания работает правильно, но удаление этих украшений не работает.
Вот полный рендерер UWP:
[assembly: ExportRenderer(typeof(EnhancedLabel), typeof(EnhancedLabelRenderer))]
namespace myApp.UWP
{
public class EnhancedLabelRenderer : LabelRenderer
{
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
var strikethrough = ((EnhancedLabel)sender).Strikethrough;
var underline = ((EnhancedLabel)sender).Underline;
if (strikethrough && underline)
{
Control.TextDecorations = TextDecorations.Strikethrough | TextDecorations.Underline;
}
else if (strikethrough)
{
Control.TextDecorations = TextDecorations.Strikethrough;
}
else if (underline)
{
Control.TextDecorations = TextDecorations.Underline;
}
else
{
Control.TextDecorations = TextDecorations.None;
}
}
}
}
EnhancedLabel
простой класс, который расширяет Xamarin.Forms.Label
и добавляет простое BindableProperty
поля, которые указывают зачеркивание или подчеркивание.
Рендерер правильно настроен TextDecorations.None
, но это не влияет на пользовательский интерфейс. Я работал с этим в отладчике, и на самом деле можно увидеть, что состояние TextBlock
в пределах ExtendedLabel
имеет TextDecorations.None
, но пользовательский интерфейс все еще рисует его с подчеркиванием или зачеркиванием (по сути, любой из них может быть добавлен, но ни один не может быть удален).
Я просмотрел документацию по Xamarin, посмотрел на ошибки в Bugzilla и не нашел никаких подсказок. Кто-нибудь еще сталкивался с этим? Хотите знать, есть ли какой-то конкретный вызов UWP, который я должен сделать, который я пропустил, или если я использую TextDecorations
неправильный способ применения стилей, или если я действительно наткнулся на ошибку.
1 ответ
Ошибка в UWP, как в Xaml ниже:
<TextBlock>
<Run Text="Decorations can be toggled on and off"/>
</TextBlock>
<TextBlock Text="Decorations will not toggle off"/>
Это та же проблема, если вы кодируете TextBlock:
TextBlock textBlock = new TextBlock { FontSize = 18.0 };
textBlock.Inlines.Add(new Windows.UI.Xaml.Documents.Run { Text = "This text will not stick on text decoration." });
TextBlock textBlockBad = new TextBlock
{
FontSize = 18.0,
Text = "This text will not enable the TextDecorations to be turned off"
};
Такое же поведение наблюдается с Typography.Capitals
Просто нужно использовать только Inlines для TextBlocks и, предположительно, RichTextBlocks, чтобы избежать этих проблем.
Интересно, есть ли специфический для UWP вызов, который мне нужно сделать, который я пропустил, или если использование TextDecorations - неправильный способ применения стилей, или я действительно наткнулся на ошибку.
Если вы хотите использовать TextDecorations
Вы могли бы использовать Run
экземпляр для упаковки оформленного текста, как следует.
Underline ul = new Underline();
ul.TextDecorations = TextDecorations.Strikethrough;
Run r = new Run();
r.Text = "Here is an underlined text";
ul.Inlines.Add(r);
MyTextBlock.Inlines.Add(ul);
По вашему требованию я создал CustomLabel, который вы могли бы использовать напрямую.
CustomLabel.cs
public class CustomLabel : Label
{
public static readonly BindableProperty DeckProperty = BindableProperty.Create(
propertyName: "Deck",
returnType: typeof(TextDeck),
declaringType: typeof(CustomLabel),
defaultValue: default(TextDeck));
public TextDeck Deck
{
get { return (TextDeck) GetValue(DeckProperty); }
set { SetValue(DeckProperty, value); }
}
}
public enum TextDeck
{
None = 0,
//
// Summary:
// Underline is applied to the text.
Underline = 1,
//
// Summary:
// Strikethrough is applied to the text.
Strikethrough = 2
}
CustomLabelRenderer.cs
public class CustomLabelRenderer : LabelRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
{
base.OnElementChanged(e);
if (Control != null)
{
var element = Element as CustomLabel;
var underline = new Underline();
var run = new Run();
switch (element.Deck)
{
case TextDeck.None:
underline.TextDecorations = TextDecorations.None;
break;
case TextDeck.Strikethrough:
underline.TextDecorations = TextDecorations.Strikethrough;
break;
case TextDeck.Underline:
underline.TextDecorations = TextDecorations.Underline;
break;
}
run.Text = element.Text;
underline.Inlines.Add(run);
Control.Inlines.Clear();
Control.Inlines.Add(underline);
}
}
}
использование
<local:CustomLabel Deck="Underline" Text="Welcome to Xamarin.Forms!" />