Xamarin.Forms 2.5.0 和上下文

Xamarin.Forms 2.5.0 and Context

今天我更新到 Xamarin.Forms 2.5.0 并看到我收到以下警告:

如何获取本地上下文而不是 Forms.Context

在我的ButtonRenderer中只有OnElementChanged()方法,所以我应该在这里更改什么?只需添加一个 ButtonRenderer(Context) 构造函数?如果我在我的平台渲染器 class 中这样做,我仍然会收到警告。有人有例子吗? official documentation doesn't mention it and Google also doesn't bring some useful results, except the open source code of ButtonRenderer。此更改还涉及许多其他渲染器 classes.

有没有人经历过其他的变化,比如刹车插件等等?

PS:我也没有发现,当 Device.Windows 被弃用时。现在我用 Device.UWP 替换了它。

使用Android.App.Application.Context

Forums

上有关于此主题的讨论

我对 SearchBarRenderer 也有同样的问题,我需要做的就是添加一个构造函数,如下所示:

public ShowSearchBarRenderer(Context context) : base(context)
{
}

希望这能回答您问题的第二部分。

这里有两个问题:

  1. 如何更新自定义呈现器以使用本地上下文?
  2. 现在 Xamarin.Forms.Forms.Context 已过时,我如何访问当前上下文?

如何更新自定义渲染器

将重载的构造函数添加到每个自定义渲染器

这是一个使用 ButtonRenderer

的例子
[assembly: ExportRenderer(typeof(CustomButton), typeof(CustomButtonRenderer))]
namespace MyApp.Droid
{
    public class CustomButtonRenderer : ButtonRenderer
    {
        public CustomButtonRenderer(Context context) : base(context)
        {

        }

        protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);
            //ToDo: Customize Button
        }
    }
}

如何访问当前上下文

安装Xamarin.Essentials NugGet Package

现在,您可以在需要访问当前activity时调用Xamarin.Essentials.Platform.AppContext

下面是如何在 Xamarin.Forms 中打开应用程序设置的示例。

[assembly: Dependency(typeof(DeepLinks_Android))]
namespace MyApp.Droid
{
    public class DeepLinks_Android : IDeepLinks
    {
        Context CurrentContext => Xamarin.Essentials.Platform.AppContext;

        public Task OpenSettings()
        {
            var myAppSettingsIntent = new Intent(Settings.ActionApplicationDetailsSettings, Android.Net.Uri.Parse("package:" + CurrentContext.PackageName));
            myAppSettingsIntent.AddCategory(Intent.CategoryDefault);

            return Task.Run(() =>
            {
                try
                {
                    CurrentContext.StartActivity(myAppSettingsIntent);
                }
                catch (Exception)
                {
                    Toast.MakeText(CurrentContext.ApplicationContext, "Unable to open Settings", ToastLength.Short);
                }
            });
        }
    }
}