PlatformEffect无法附加?

时间:2016-04-06 14:32:32

标签: xamarin.forms effects

我相信我无法连接PlatformEffect。它似乎正在解决但没有附加。以下是名为EffectTestLib.iOS的iOS库项目中的PlatformEffect:

using System;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ResolutionGroupName ("MyCompany")]
[assembly: ExportEffect (typeof (EffectTestLib.iOS.MyEffect), "MyEffect")]
namespace EffectTestLib.iOS {

    public class MyEffect : PlatformEffect {

        protected override void OnAttached () {
            System.Diagnostics.Debug.WriteLine ("Effect Attached");
            throw new NotImplementedException ();
        }

        protected override void OnDetached () {
            throw new NotImplementedException ();
        }

        protected override void OnElementPropertyChanged (System.ComponentModel.PropertyChangedEventArgs args) {
            base.OnElementPropertyChanged (args);
        }
    }
}

所以,如果它附加了,它应该输出“Effect Attached”并抛出NotImplementedException

以下是使用此PlatformEffect的应用程序的PCL代码:

using Xamarin.Forms;

namespace EffectTest { 
    public class App : Application {
        public App () {
            MainPage = new ContentPage {
                Content = new StackLayout {
                    VerticalOptions = LayoutOptions.Center,
                    Children = {
                        new Label {
                            XAlign = TextAlignment.Center,
                            Text = "Welcome to Xamarin Forms!"
                        }
                    }
                }
            };
            var effect = Effect.Resolve ("MyCompany.MyEffect");
            System.Diagnostics.Debug.WriteLine ("effect=[{0}]",effect);
            MainPage.Effects.Add(effect);
        }
    }
}

注意我正在将PlatformEffect写入应用程序的输出以验证它是否已解决。如果它没有解决,我应该看到effect=[Xamarin.Forms.NullEffect]

这是应用程序iOS平台代码:     使用系统;     使用System.Collections.Generic;     使用System.Linq;     使用基金会;     使用UIKit;

namespace EffectTest.iOS
{
    [Register ("AppDelegate")]
    public partial class AppDelegate :     global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
    {
        public override bool FinishedLaunching (UIApplication app, NSDictionary options)
        {
            global::Xamarin.Forms.Forms.Init ();
            new EffectTestLib.iOS.MyEffect ();

            LoadApplication (new App ());

            return base.FinishedLaunching (app, options);
        }
    }
}

请注意,我正在调用new EffectTestLib.iOS.MyEffect ();以确保我的库正在加载。

此外,iOS平台项目包含对EffectTestLib.iOS库的引用。

因此,当我运行应用程序时,会发生这种情况:

2016-04-06 10:17:18.342 EffectTest.iOS[26578:8696061] effect=[EffectTestLib.iOS.MyEffect]

因此,PlatformEffect已正确解析。但是,它不会输出“Effect Attached”,也不会抛出NotImplementedException。另请注意,如果我更改MainPage的属性,则永远不会调用MyEffect.OnPropertyChanged。

回顾https://developer.xamarin.com/guides/xamarin-forms/effects/creating/,我似乎是:

  1. 创建PlatformEffect类的子类
  2. 覆盖OnAttached方法
  3. 覆盖OnDetached方法
  4. 将ResolutionGroupName属性添加到效果类。
  5. 将ExportEffect属性添加到效果类。
  6. 并且,回头看https://developer.xamarin.com/guides/xamarin-forms/effects/creating/#Consuming_the_Effect_in_C,似乎我将效果添加到效果集合页面。

    我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

我已经看过你的项目并修改了它的工作代码, 它不会在MainPage上调用, 观察是在页面上不起作用,在它工作的视图上(将在详细查找后编辑此观察)。 试着这样做。

using Xamarin.Forms;

namespace EffectTest { 
    public class App : Application {
        public App () {
            var label = new Label();
            label.Effects.Add (Effect.Resolve ("MyCompany.EffectCheck"));
            MainPage = new RootPage ();
            var effect = Effect.Resolve ("MyCompany.EffectCheck");
            System.Diagnostics.Debug.WriteLine ("effect=[{0}]",effect);
            //MainPage.Effects.Add(Effect.Resolve ("MyCompany.EffectCheck"));
        }

        protected override void OnStart () {
        }

        protected override void OnSleep () {
        }

        protected override void OnResume () {
        }
    }
}

using Xamarin.Forms;

namespace EffectTest
{
    public class RootPage:ContentPage
    {
        public RootPage()
        {
            Content = new StackLayout () {
                Children = {
                    new Label ()
                }
            };
// this.Effects.Add(Effect.Resolve ("MyCompany.EffectCheck")); will not work
                    Content.Effects.Add(Effect.Resolve ("MyCompany.EffectCheck")); // it will work;
        }
    }

}