Невозможно очистить 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!" />

введите описание изображения здесь

Другие вопросы по тегам