--- /dev/null
+using Xamarin.Forms.CustomAttributes;
+using Xamarin.Forms.Internals;
+using System.Linq;
+using System;
+
+namespace Xamarin.Forms.Controls.Issues
+{
+ [Preserve(AllMembers = true)]
+ [Issue(IssueTracker.Bugzilla, 42599, "LineBreakMode does not work on UWP", PlatformAffected.WinRT)]
+ public class Bugzilla42599 : TestContentPage
+ {
+ protected override void Init()
+ {
+ var scrollView = new ScrollView();
+ var layout = new StackLayout();
+
+ foreach (var lineBreakMode in Enum.GetValues(typeof(LineBreakMode)).Cast<LineBreakMode>())
+ {
+ layout.Children.Add(GetLayout(lineBreakMode));
+ }
+ scrollView.Content = layout;
+ Content = scrollView;
+ }
+
+ static StackLayout GetLayout(LineBreakMode lineBreakMode)
+ {
+ var text = "";
+
+ switch (lineBreakMode)
+ {
+ default:
+ case LineBreakMode.NoWrap:
+ text = "This is a long sentence that should NOT wrap. If this sentence has wrapped, then this test has failed.";
+ break;
+ case LineBreakMode.WordWrap:
+ text = "This is a long sentence that should word wrap. If this sentence has NOT wrapped, then this test has failed.";
+ break;
+ case LineBreakMode.CharacterWrap:
+ text = "This is a long sentence that should character wrap. If this sentence has NOT wrapped, then this test has failed.";
+ break;
+ case LineBreakMode.HeadTruncation:
+ text = "This is a long sentence that should truncate at the beginning. If this sentence has NOT truncated, then this test has failed.";
+ break;
+ case LineBreakMode.TailTruncation:
+ text = "This is a long sentence that should truncate at the end. If this sentence has NOT truncated, then this test has failed.";
+ break;
+ case LineBreakMode.MiddleTruncation:
+ text = "This is a long sentence that should truncate at the middle. If this sentence has NOT truncated, then this test has failed.";
+ break;
+ }
+
+ var label = new Label
+ {
+ LineBreakMode = lineBreakMode,
+ Text = text,
+ };
+
+ var layout = new StackLayout
+ {
+ Children = { label },
+ Orientation = StackOrientation.Horizontal
+ };
+
+ return layout;
+ }
+ }
+}
\ No newline at end of file
{
bool _fontApplied;
bool _isInitiallyDefault;
+ SizeRequest _perfectSize;
+ bool _perfectSizeValid;
protected override Windows.Foundation.Size ArrangeOverride(Windows.Foundation.Size finalSize)
{
return finalSize;
}
+ public override SizeRequest GetDesiredSize(double widthConstraint, double heightConstraint)
+ {
+ if (!_perfectSizeValid)
+ {
+ _perfectSize = base.GetDesiredSize(double.PositiveInfinity, double.PositiveInfinity);
+ _perfectSize.Minimum = new Size(Math.Min(10, _perfectSize.Request.Width), _perfectSize.Request.Height);
+ _perfectSizeValid = true;
+ }
+
+ if (widthConstraint >= _perfectSize.Request.Width && heightConstraint >= _perfectSize.Request.Height)
+ return _perfectSize;
+
+ var result = base.GetDesiredSize(widthConstraint, heightConstraint);
+ result.Minimum = new Size(Math.Min(10, result.Request.Width), result.Request.Height);
+ if (Element.LineBreakMode != LineBreakMode.NoWrap)
+ {
+ if (result.Request.Width > widthConstraint || Element.LineBreakMode == LineBreakMode.WordWrap || Element.LineBreakMode == LineBreakMode.CharacterWrap)
+ result.Request = new Size(Math.Max(result.Minimum.Width, widthConstraint), result.Request.Height);
+ }
+
+ return result;
+ }
+
protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
{
base.OnElementChanged(e);
void UpdateAlign(TextBlock textBlock)
{
+ _perfectSizeValid = false;
+
if (textBlock == null)
return;
void UpdateFont(TextBlock textBlock)
{
+ _perfectSizeValid = false;
+
if (textBlock == null)
return;
void UpdateLineBreakMode(TextBlock textBlock)
{
+ _perfectSizeValid = false;
+
if (textBlock == null)
return;
textBlock.TextWrapping = TextWrapping.Wrap;
break;
case LineBreakMode.HeadTruncation:
+ // TODO: This truncates at the end.
textBlock.TextTrimming = TextTrimming.WordEllipsis;
textBlock.TextWrapping = TextWrapping.NoWrap;
break;
textBlock.TextWrapping = TextWrapping.NoWrap;
break;
case LineBreakMode.MiddleTruncation:
+ // TODO: This truncates at the end.
textBlock.TextTrimming = TextTrimming.WordEllipsis;
textBlock.TextWrapping = TextWrapping.NoWrap;
break;
void UpdateText(TextBlock textBlock)
{
+ _perfectSizeValid = false;
+
if (textBlock == null)
return;