2017-09-19 5 views
1

コンテキストExrin IMasterDetailContainer IsPresentedは効果がありません、ナビゲーション引き出し

私はExrinリポジトリからExrinSampleMobileAppを使用していますを非表示にする方法について説明します。スワイプでナビゲーション用の引き出しを表示すると、引き出しが正しく表示されます。私はreturn new NavigationResult(Stacks.Main, Main.Settings);にMenuOperationを修正した後、それを正しくナビゲートしますが、引き出しが上に残っている(、[設定]ナビゲーションをクリックする。

私はXamarin MasterDetailPageのIsPresentedは引き出しを隠すために偽に設定する必要があることを知っている。私も発見その、この目的のためにこのような理由のために(もIsPresented呼ばれる)プロパティを提供して抽象化IMasterDetailContainerがある

質問

しかし疑問があります。いつどこでこのプロパティをfalseに設定するために、どのようにそれにアクセスする(私はIMasterDetailContainerにアクセスする方法を意味する

完成したAutofac BuilderをIMasterDetailContainerの実装に追加できないので、静的な参照を介して渡すことにしました。これを行うには良い方法があるかもしれないので、

// Note: This code from the otherwise unchanged ExrinSampleMobileApp from the Exrin repository 
public class MenuOperation : ISingleOperation 
{ 
    public static IMasterDetailContainer Mdc; 
    private IMasterDetailContainer _masterDetailContainer; 

    public MenuOperation(IMasterDetailContainer masterDetailContainer) 
    { 
     _masterDetailContainer = masterDetailContainer; 
    } 

    public Func<object, CancellationToken, Task<IList<IResult>>> Function 
    { 
     get 
     { 
      return (parameter, token) => 
      { 
       // _masterDetailContainer = false 
       // Shame, but no DI worked, so this is only for diagnostics (static): 
       // This set really false, however the drawer remains and navigation freezed. 
       Mdc.IsPresented = false; 

       return new NavigationResult(Stacks.Main, Main.Settings); 

       // Original navigation was: 
       //return new NavigationResult(Containers.Main, Regions.Main, Stacks.Second, Second.Detail); 
      }; 
     } 
    } 

答えて

1

私はExrinに慣れていないんだけど、どのようにMessaging Centerの使用に関する:残念ながら、コメント付きソースコードを見ていないのですか?素晴らしいデカップリングが得られ、MainContainerでコードを実行してMenuOperationクラスからメニューを適切に非表示にすることができます。

MenuOperation:

return (parameter, token) => 
{   
    // MainContainer will subscribe to this message and hide the drawer 
    MessagingCenter.Send<MenuOperation> (this, "HideDrawer"); 

    return new NavigationResult(Stacks.Main, Main.Settings); 

    ... 

MainContainer:

public MainContainer(TabbedViewContainer mainStack, MenuStack menuStack) : base(Containers.Main.ToString()) 
{ 
    MessagingCenter.Subscribe<MenuOperation> (this, "HideDrawer", (sender) => 
    { 
     IsPresented = false; 
    } 

    ... 

私はまた、人々はあなたがやったように、静的参照を保存しますが、App.xaml.csファイルで見てきました。しかし、それは私の意見では不必要な複雑さを作り出します。

+0

ありがとうございました。私は2つの問題を扱っています。まず、プロパティにアクセスする方法、次にアクセスできる場合は、期待どおりに機能しない方法です。静的なことは、「私がアクセスできたら、それが何であるか」と試してみるだけで、一時的にはきれいになりました。 –

+0

私は何かを持っています...それは通常のUIスレッドです。そのプロパティを設定するのは、UIスレッドでのみ可能です。奇妙なことが起こらない限り...(Device.BeginInvokeOnMainThread) –

1

これを行うには、PushAsyncとPopAsyncのNavigationProxyを変更するのが最も良い方法です。これに置き換え、必要に応じて変更してください。

public async Task PopAsync() 
    { 
     CloseMenu(); 

     await _page.PopAsync();   
    } 

    public async Task PushAsync(object page) 
    { 
     var xamarinPage = page as Page; 

     if (xamarinPage == null) 
      throw new Exception("PushAsync can not push a non Xamarin Page"); 

     CloseMenu(); 

     await _page.PushAsync(xamarinPage, true); 
    } 

    private void CloseMenu() 
    { 
     if (Application.Current.MainPage is MasterDetailPage masterDetailPage) 
      masterDetailPage.IsPresented = false; 
    } 
+0

多くのご協力ありがとうございます。残念ながら、ユーザーが特定のページに移動したときにメニューを使用すると同じメニュー項目が選択され、ナビゲーションは行われないため、傍受は発生しません。私はバックアッププランを持って、Func 、Task> HandleResultをMenuViewModelに置き換え、IsPresent = falseをメインUIスレッドにマーシャリングします。 (またはそれ以上:MainContainerのプロキシプロパティ設定ツールをマーシャリングする)しかし、IMasterDetailContainerにアクセスすることは依然として問題であり、DIはここで再生されません... –

関連する問題