Xamarin.Forms 2.5.0和Context

时间:2017-11-21 15:42:41

标签: c# xamarin xamarin.forms custom-renderer

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

  • 来自Android子项目:
      

    警告CS0618' Forms.Context'已废弃:'从版本2.5开始,Context已过时。请改用本地语境。'

如何获取本地上下文而不是Forms.ContextIs the Android Context meant?

  • 来自自定义渲染器:
      

    警告CS0618' ButtonRenderer.ButtonRenderer()'已过时:'从2.5版开始,此构造函数已过时。请改用ButtonRenderer(上下文)。'

在我的ButtonRenderer我只有OnElementChanged()方法,所以我应该在这里更改什么?只需添加ButtonRenderer(Context)构造函数?如果我在我的平台渲染器类中执行此操作,我仍然会收到警告。有人有例子吗? official documentation没有提及它,除了open source code of ButtonRenderer之外,Google也没有带来一些有用的结果。此更改还涉及许多其他渲染器类。

有没有人经历过其他变化,制动插件等等?

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

3 个答案:

答案 0 :(得分:21)

我对SearchBarRenderer有同样的问题,而我需要做的就是修复它,就像这样添加一个构造函数:

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

希望回答你问题的第二部分。

答案 1 :(得分:11)

这里有两个问题:

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

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

    以下是使用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
            }
        }
    }
    

    如何访问当前上下文

    安装@MotzCurrentActivityPlugin

    现在,您可以在需要访问当前活动时致电CrossCurrentActivity.Current.Activity

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

    [assembly: Dependency(typeof(DeepLinks_Android))]
    namespace MyApp.Droid
    {
        public class DeepLinks_Android : IDeepLinks
        {
            Context CurrentContext => CrossCurrentActivity.Current.Activity;
    
            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);
                    }
                });
            }
        }
    }
    

答案 2 :(得分:10)

使用Android.App.Application.Context

Forums

上讨论了这个主题