summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Platform.WinRT
diff options
context:
space:
mode:
authorSamantha Houts <samantha@teamredwall.com>2017-03-14 03:51:28 -0700
committerRui Marinho <me@ruimarinho.net>2017-03-14 10:51:28 +0000
commit05f0f7610f197ccc862e5a815376c3cd93d0efe8 (patch)
tree93410e98619949a7fdeac7ba225851d58644a91d /Xamarin.Forms.Platform.WinRT
parente7f5a4188d2c102a3eada30b2d55a5e7ee481f1d (diff)
downloadxamarin-forms-05f0f7610f197ccc862e5a815376c3cd93d0efe8.tar.gz
xamarin-forms-05f0f7610f197ccc862e5a815376c3cd93d0efe8.tar.bz2
xamarin-forms-05f0f7610f197ccc862e5a815376c3cd93d0efe8.zip
[Win] Labels will now wrap when inside horizontally infinite layouts (#639)
* Add repro for 42559 * [Win] Override GetDesiredSize for LabelRenderer * [Win] Invalidate size on font/align change
Diffstat (limited to 'Xamarin.Forms.Platform.WinRT')
-rw-r--r--Xamarin.Forms.Platform.WinRT/LabelRenderer.cs35
1 files changed, 35 insertions, 0 deletions
diff --git a/Xamarin.Forms.Platform.WinRT/LabelRenderer.cs b/Xamarin.Forms.Platform.WinRT/LabelRenderer.cs
index 33f1fee3..5101b167 100644
--- a/Xamarin.Forms.Platform.WinRT/LabelRenderer.cs
+++ b/Xamarin.Forms.Platform.WinRT/LabelRenderer.cs
@@ -35,6 +35,8 @@ namespace Xamarin.Forms.Platform.WinRT
{
bool _fontApplied;
bool _isInitiallyDefault;
+ SizeRequest _perfectSize;
+ bool _perfectSizeValid;
protected override Windows.Foundation.Size ArrangeOverride(Windows.Foundation.Size finalSize)
{
@@ -61,6 +63,29 @@ namespace Xamarin.Forms.Platform.WinRT
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);
@@ -100,6 +125,8 @@ namespace Xamarin.Forms.Platform.WinRT
void UpdateAlign(TextBlock textBlock)
{
+ _perfectSizeValid = false;
+
if (textBlock == null)
return;
@@ -129,6 +156,8 @@ namespace Xamarin.Forms.Platform.WinRT
void UpdateFont(TextBlock textBlock)
{
+ _perfectSizeValid = false;
+
if (textBlock == null)
return;
@@ -146,6 +175,8 @@ namespace Xamarin.Forms.Platform.WinRT
void UpdateLineBreakMode(TextBlock textBlock)
{
+ _perfectSizeValid = false;
+
if (textBlock == null)
return;
@@ -164,6 +195,7 @@ namespace Xamarin.Forms.Platform.WinRT
textBlock.TextWrapping = TextWrapping.Wrap;
break;
case LineBreakMode.HeadTruncation:
+ // TODO: This truncates at the end.
textBlock.TextTrimming = TextTrimming.WordEllipsis;
textBlock.TextWrapping = TextWrapping.NoWrap;
break;
@@ -172,6 +204,7 @@ namespace Xamarin.Forms.Platform.WinRT
textBlock.TextWrapping = TextWrapping.NoWrap;
break;
case LineBreakMode.MiddleTruncation:
+ // TODO: This truncates at the end.
textBlock.TextTrimming = TextTrimming.WordEllipsis;
textBlock.TextWrapping = TextWrapping.NoWrap;
break;
@@ -182,6 +215,8 @@ namespace Xamarin.Forms.Platform.WinRT
void UpdateText(TextBlock textBlock)
{
+ _perfectSizeValid = false;
+
if (textBlock == null)
return;