2016-04-06 3 views
0

Я считаю, что мне трудно получить приложение PlatformEffect. Похоже, что он разрешается, но не присоединяется. Вот PlatformEffect в библиотеке проекта IOS имени EffectTestLib.iOS:ПлатформаEffect не прилагается?

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); 
     } 
    } 
} 

Так что, если он присоединяется, он должен вывести «Эффект Attached» и бросить NotImplementedException.

Вот код PCL для приложения, использующего этот PlatformEffect:

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; с использованием Foundation; с использованием 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 к классу эффектов.

И, обращаясь к https://developer.xamarin.com/guides/xamarin-forms/effects/creating/#Consuming_the_Effect_in_C, кажется, что я добавляю эффект к страницам Коллекция эффектов.

Что я здесь делаю неправильно?

+0

код Источник: https://github.com/baskren/PlatformEffect_issue – baskren

+0

Повторяя мой ответ на Сакет, оказывается, что PlatformEffects работают на элементах страницы в Android, но не в прошивке.Я обновил [проект образца github] (https://github.com/baskren/PlatformEffect_issue), чтобы проиллюстрировать это. – baskren

ответ

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; 
     } 
    } 

} 
+1

Спасибо, что посмотрели на это. Похоже, что PlatformEffects работают на элементах страницы в Android, но не iOS. Я обновил [этот пример github project] (https://github.com/baskren/PlatformEffect_issue), чтобы показать это. – baskren

Смежные вопросы