无法清除Xamarin Forms UWP App

时间:2017-12-19 19:39:21

标签: xamarin 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,但这对UI没有影响。我在调试器中已经完成了这个工作,并且实际上可以看到TextBlock中的ExtendedLabel的状态为TextDecorations.None,但UI仍然使用下划线或删除线绘制它(基本上,可以添加其中任何一个,但都不能删除。)

我已经阅读了Xamarin文档并查看了Bugzilla中的错误,但没有发现任何线索。有人遇到过这种情况么?想知道我是否需要进行特定于UWP的调用我错过了,或者使用TextDecorations是否是应用样式的错误方式,或者我实际上偶然发现了错误。

2 个答案:

答案 0 :(得分:1)

  

想知道我是否需要进行特定于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!" />

enter image description here

答案 1 :(得分:0)

如下面的Xaml中所示,在UWP中显示错误:

                <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发现的行为相同
只需对TextBlocks和大概RichTextBlocks使用Inlines即可避免这些问题。