2017-07-18 15 views
0

誰かが作成し、UserControlの1つのインスタンスを管理し、複数のXAMLページにわたって共有する方法を知っていますか?XAMLSの間で共有されるUserControlの単一インスタンス

私のシナリオでは、バックグラウンド更新チェッカーを作成しています。私のUserControlsのインスタンスに、IProgressなどを使用して、自分のバックグラウンドスレッド(TAPパターン)から進行状況の更新を受信させたいという問題があります。今、Observerパターンなどを使ってバックグラウンドスレッドに登録することでこれを解決できます。しかし、私がUserControlの共有インスタンスを作成することができれば、iOSがどのように動作するかに似ています。

他のアイデアをいただければ幸いです!

+1

かなりわからないが、私はあなたがAutofac' 'のようなDIコンテナを使用することができると思うと登録UserControl'は、単一のインスタンス – Alex

+0

@viscように私は右のそれを取得していた場合は'ことを、あなたにいつでもあなたが望むページからアクセスできるようにしたいと思うベースビューがありますか?それとも、コード内の任意のページやサービスから必要なときにいつでもポップアップできるuserControlを持たせたいのですか?それとも何か他のことですか? –

+0

@AdityaSharma私は、そのタイプのすべてのページに共通のXAMLにUserControlを含むページまたは "ビュー"を持っています。つまり、すべてのページがこのUserControlを持つわけではなく、特定のタイプのものだけである。つまり、私はそのUserControlへのハンドル/インスタンスをすべてのページにわたって一定のままにしたいと思います。したがって、UI要素で操作するスレッドは、同じコントローラを参照できます。オブザーバーのパターンは必要ありません。 – visc

答えて

0

コメントから理解した後、私の答えがそうでなければコメントセクションを自由に使用できると分かっていれば、私はそれを明確に理解していると思います。あなたは全体userControlstatic作るの代わりにuserControlのシングルトンの静的インスタンスを作成することができ、右のそれに


取得。たとえば、ユーザーコントロール"UserDataControl"という名前のコントロールがあるとします。背後にあるコードでの静的変数を宣言します。

public static UserDataControl Instance { get; set; } 

、それのコンストラクタは、以下のようなものになります:あなたは同じインスタンスを使用して複数のページにuserControlを追加したいので、今

public UserDataControl() 
{ 
    this.InitializeComponent(); 
    Instance = this; 
} 

XAMLでコントロールを追加することはできません。したがって、C#を使用すると、onLoaded関数でuserControlをグリッドまたはContainer wishに追加します。インスタンスがnullの場合は、初期化している場合ので、チェック:例えばの場合:

Loaded += (s, e) => 
{ 
     if (UserControls.UserDataControl.Instance == null) 
     UserControls.UserDataControl.Instance = new UserControls.UserDataControl(); 

     rootLayout.Children.Add(UserControls.UserDataControl.Instance); 
}; 

は注意してください:メインページの上にあなたは以下rootLayoutGridにコントロールを追加することはonLoadedイベントのコードです初めてそれはnullになります。今

あなたがElement is already the child of another Element例外を回避するためにSingleton Instanceを使用しているすべてのページでOnNavigatingFromイベントをoverride確認してナビゲートしながら。

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) 
{ 
    //remove the user control as a child as leaving it as a child will throw you an 
    //error "No installed components were detected. Element is already the child of another element." 
if (rootLayout.Children.Contains(UserControls.UserDataControl.Instance)) 
      rootLayout.Children.Remove(UserControls.UserDataControl.Instance); 
     base.OnNavigatingFrom(e); 
} 

それだ:以下、上記の例からのコードです。完全なサンプルコードについては、デモのソースコードを1つのドライブからダウンロードできます。

のGitHub LINK:SharedUserControlSample

+0

私はあなたが実際にシングルトンを初期化し、それをUserControlのコンストラクタで参照することをお勧めします。また、これをPlatform :: WeakReferenceとして格納することを検討してください。最後に、Adityaが言ったように、チェックをヌルにしてください! –

+0

@viscにこの問題が解決しましたか?もしそうなら、あなたはこのスレッドが閉じられるように私の答えを正しいとマークしてください(あるいはアプローチを気に入っていればそれをアップvoteしてもいいですか?) –

関連する問題