Xamarin Forms自定义渲染器

时间:2018-03-10 17:50:23

标签: c# xamarin.forms custom-renderer

我有一个从Frame继承的自定义控件。 (简而言之,它是我在整个应用内容中展示的一种自定义警报框。)

我正在使用Custom Renderer来实现这一目标。 在xaml中,控件直接位于页面上(在其他控件中)(实际上,我在condebehind中创建它,但这没有区别)。 (目前仅针对iOS实现)。 显示/隐藏由IsVisible XF属性启动。然后,我将容器视图(本机视图)添加到应用程序的根目录中。

    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "IsVisible")
        {
            // showing/hiding here

在这种情况下,我有两个问题: 1.在此活动中,提升内容定位原生视图的权利是非常初始化:视图的iOS框架值&# 39; t有任何宽度/高度设置。这一切都可能在之后完成,所以我做的是以下内容:

                Task.Run(async () =>
                {
                    await Task.Delay(10);
                    InvokeOnMainThread(() =>
                    {
                        SetupLayout();
                        Subviews[0].Alpha = 1;
                        SetupAnimationIn();
                    });
                });

......这通常有效,但仍然不是很轻微,而且这种方法既不可靠也不好。

  1. IsVisible = false它更糟糕的是:我无法处理离开动画,因为元素内容在发出通知之后(甚至之前)被XF引擎(我猜)破坏了,所以< strong>元素立即消失,这对用户体验来说并不好看。
  2. 那么,有什么好方法可以处理这些事情吗?

1 个答案:

答案 0 :(得分:0)

可能已经晚了,但是我想我会为其他尝试做类似事情的人提供一些指导。对于(1),我不确定您的意思是原生视图还没有完全初始化,但是您可能会发现这很有用:

var measurement = Measure(screenWidth, screenHeight);
var contentHeight = measurement.Request.Height;

您可以在docs中详细了解'Measure'方法的作用,但是基本上,它基于内容为视图元素提供了最小尺寸。参数是约束,因此请使用视图可能的最大大小。您可以通过设置'WidthRequest'和'HeightRequest'来手动初始化尺寸。

(2)基本上,您需要像这样重写IsVisible属性:

public static new readonly BindableProperty IsVisibleProperty = BindableProperty.Create(
        nameof(IsVisible), typeof(bool), typeof(MyCustomView), default(bool), BindingMode.OneWay);
public new bool IsVisible
{
    get => (bool)GetValue(IsVisibleProperty);
    set => SetValue(IsVisibleProperty, value);
}

请注意使用new关键字来覆盖继承的属性。当然,那么您将需要自己处理可见性。

protected override void OnPropertyChanged(string propertyName = null)
    {
        base.OnPropertyChanged(propertyName);

        if (propertyName == IsVisibleProperty.PropertyName)
        {
            if (IsVisible) AnimateIn();
            else AnimateOut();
        }
    }

现在,您可以根据需要处理可见性。希望这会有所帮助!