Xamarin表单在设备方向更改时重绘StackLayout

时间:2019-02-11 15:26:14

标签: xamarin xamarin.forms

在我的 MainPage.xaml (即 ContentPage )中,我有一个 GradientColorStack

<local:GradientColorStack x:Name="ColorStack" StartColor="#FF0000" EndColor="#FFFF00">

该类具有 StackLayout 作为基类,它呈现的背景具有渐变颜色填充。我是从here得到这个想法的。

public class GradientColorStack : StackLayout

问题在于,在更改设备方向时,不会重新绘制背景色填充。因此,在横向方向上,会有一个很大的黑色填充间隙,您可以在其中通过GradientColorStack看到ContentPage背景。

是否有一种方法可以在设备方向更改时强制GradientColorStack重新绘制?

2 个答案:

答案 0 :(得分:0)

您可以在 android 渲染器中使用 ForceLayout(),在 iOS 渲染器中使用 SetNeedDisplay()正在强制刷新布局。

答案 1 :(得分:0)

iOS版本

我在渲染器类中添加了以下方法:

class Person {
  constructor(name, age) {
    this._name = name;
    this._age = age;
  }

  get name() {
    return this._name;
  }

  get age() {
    return this._age;
  }

  set age(num) {
    if (num.isNaN()) {
      console.log('error!')
    } else {
      this._age = num
    }
  }
}

let human = new Person('Armand', 'string');

console.log(human);

这将导致在屏幕方向事件上调用同一类的protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) { SetNeedsDisplay(); base.OnElementPropertyChanged(sender, e); } 方法。现在,在Draw()中,找到现有的 CAGradientLayer (如果存在)并将其从超级层中删除,然后让Draw()例程然后计算一个新的 CAGradientLayer ,然后将其照常添加到NativeView.Layer.Sublayers集合中。

感谢@SHUBHAM SHARMA提供使用Draw()的技巧,但也需要this post才能使解决方案正常工作。


Android版本

事实证明,Android版本已经可以正确重绘渐变层(请参见tutorial)。我认为这是由于渲染器类中的以下方法所致:

SetNeedsDisplay()