2016-07-21 7 views
1

私はXamarin.formsを使用してアプリケーションを作成しています。 (PCL)Xamarin.formsのnuGetパッケージのカスタムレンダリングが矛盾します

私はちょうどカスタムレンダラーを使用することに深刻な問題に気づいた。 私はこのスレッドから来ました。 https://forums.xamarin.com/discussion/54317/new-xamarin-forms-guide-custom-renderers/p2

このスレッドは、私が経験したことは、1つのレンダラークラスだけが同時に動作することです。 2つの異なるパッケージが同じレンダラーを使用すると、そのうちの1つが動作しないことを意味します。

パッケージが追加されたばかりの場合は、元のパッケージや鉱山が破損する可能性があります。実際の問題は、開発者がその時点で気付かないことがあることです。

なぜ動作するのですか? または、私は間違っていますか間違っていませんか?すでにContentPageやページのカスタムレンダラを持つカスタムContentPageのレンダラーとインストール済みのパッケージを作った場合

。私の場合、KeyboardOverlap.Forms.Pluginはそうです。両方のレンダラークラスがOnApearing()をオーバーライドしました。あなたのアプリを実行するとき。レンダラーのOnApearingは1つだけ解雇されます。

もちろん私はそれを手でマージすることができます。しかし、両方ともnuGetパッケージであり、それらを変更できない場合はどうなりますか? (もちろんGithubを使用することもできますが、別の問題が発生します)

+0

例を挙げることができますか?私は完全にフォローされているかわからない。私はかなり複雑なアプリケーションを書式で書いており、レンダラーが動かない問題に遭遇したことはありません。 –

+0

@ChaseFlorell ContentPage用のカスタムレンダラーと、ContentPageまたはPageのカスタムレンダラーを持つインストールされたパッケージをすでに作成している場合。私の場合、KeyboardOverlap.Forms.Pluginはそうです。両方のレンダラークラスがOnApearing()をオーバーライドしました。あなたのアプリを実行するとき。レンダラーのOnApearingは1つだけ解雇されます。 –

+0

カスタムレンダラのそれぞれに一意の名前はありませんか?これが失敗する唯一の方法は、デフォルトをオーバーライドする場合です。決して実行しないで、デフォルトから継承し、オーバーライドするときに 'base'を必ず呼び出してください。デフォルトを上書きしているためにnuget pkgが壊れている場合は、修正するように指示します。 –

答えて

2

各カスタムレンダラーには一意の名前が必要です。レンダラーが基本クラスをオーバーライドしている場合は、衝突を起こす唯一の方法はありません。決して実行しないでください。代わりに、デフォルトから継承して、オーバーライドするときにbaseに必ず呼び出してください。

デフォルトを上書きしているためにナゲットパッケージが破損している場合は、修正するように指示する必要があります。あなたは著者がPageをオーバーライド代わりの代わりに、それは

[assembly: ExportRenderer (typeof(KeyboardOverlapPage), typeof(KeyboardOverlapRenderer))] 

こと。そして、クラスを持っている必要があり、彼自身のKeyboardOverlapPage

This line is causing you pain!

を行っている、を参照しているコードでは

PCL

public class KeyboardOverlapPage : Xamarin.Forms.Page {} 

つまり、作成者はパッケージが実装されていないため、修正する必要があります。一度固定すると、ページの代わりにその機能を使用することができます。

特定のプラットフォームにカスタムレンダラがない場合、自動的にデフォルトの動作に戻ります。

+0

私はあなたが参照している特定のレポに[問題を追加]しました(https://github.com/paulpatarinski/Xamarin.Forms.Plugins/issues/101)。 –

+0

こんにちは。あなたの寛大な答えに感謝します。しかし、私はすでに既定のクラスをオーバーライドすることを回避する方法を知っています。しかし、それは今でも一度に1つのレンダラしか働くことができないということですか?レンダラーの両方の機能を使用するのはハンドマージだけでしたか?私は本当に知りたい。もしそうなら、少し迷惑ではない? –

+0

もう一度問題を追加していただき、ありがとうございます。 –