使用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
是否是应用样式的错误方式,或者我实际上偶然发现了错误。
答案 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!" />
答案 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即可避免这些问题。