2016-06-12 16 views
3

私はXamarinとC#でプログラミングを学び始めています。私は本当にこの質問に苦労しています。Xamarin:文字列からのページを開きます

私はマスターディテールアプリを持っています。私のマスターページでは、詳細ページにリンクするボタンを簡単に追加したいと思います。 これを行うには、2つのパラメータを使用して呼び出すことができるメソッドを作成します。 ボタンテキストとボタンにリンクされた詳細ページ。そうbasicly

public class MainLink : Button 
    { 
     public MainLink(string name,string page) 
     { 
      Text = name; 
      Command = new Command(o => { 
       App.MasterDetailPage.Detail = new NavigationPage(new page); 
       App.MasterDetailPage.IsPresented = false; 
      }); 
     } 
    } 

これは私がこれまで持っているものです。しかし、行:

App.MasterDetailPage.Detail = new NavigationPage(new page); 

ofcourseは動作しません。

既にページ名がわかっている場合、文字列をページタイプに変換するにはどうすればよいですか?

答えて

2

NavigationPageはページのインスタンスを取得します。 あなたは、ページの文字列に応じて、新しいページを初期化するためにswitch文を使用することができます。

switch (page) 
{ 
    case "page1": 
     App.MasterDetailPage.Detail = new NavigationPage(new Page1); 
     break; 
    case "page2": 
     App.MasterDetailPage.Detail = new NavigationPage(new Page2); 
     break; 
    default: 
     App.MasterDetailPage.Detail = new NavigationPage(new DefaultPage); 
     break;    
} 
2

また、あなたのページになりますTypeにかかるかっこいいActivator.CreateInstance()を使用することができます。

stringからTypeになるためには、次の2つのうちのいずれかを実行できます。そのように(私は実際にXamarinフォームで試していない)だけでstringを使用して型を取得しようとする次のいずれかの

Type somethingPageType = Type.GetType("SomethingPage"); 

それともあなたは自分のButtonのコンストラクタにページTypeを渡すので、のようなものを使用することができます:だから、それをすべて一緒に入れて

.... 
public MainLink(string name,string page, Type pageType) { 
    .... 
} 

、次のいずれか

public class MainLink : Button 
{ 
    public MainLink(string name,string page) 
    { 
     Text = name; 
     Command = new Command(o => { 
      Type pageType = Type.GetType(page); 

      App.MasterDetailPage.Detail = new NavigationPage(Activator.CreateInstance(pageType) as Page); 
      App.MasterDetailPage.IsPresented = false; 
     }); 
    } 
} 

または:

public class MainLink : Button 
{ 
    public MainLink(string name,string page, Type pageType) 
    { 
     Text = name; 
     Command = new Command(o => { 
      App.MasterDetailPage.Detail = new NavigationPage(Activator.CreateInstance(pageType) as Page); 
      App.MasterDetailPage.IsPresented = false; 
     }); 
    } 
} 

ただし、2つのことを覚えておいてください。まず、ページがページのコンストラクタにパラメータを渡す場合、その作業を行うには、オーバーロードをActivator.CreateInstance()にする必要があります。あなたは未使用のものを削除するにはXamarinリンカを使用している場合、それはおそらく混乱この方法まではそうあなたが特にiOSのために、私たちが行うAndroid

のために、一人で自分の反射コードを残すようにリンカに指示する必要があります。また

、すべてのコードをリンクするのではなく、SDKアセンブリのみをリンクするので、リンカの問題を心配する必要はありませんが、iOSで次のコードを使用して修正することができます(実際には以下のコードはテストしていません)。

iOSプロジェクトに.csというファイルを作成し(たとえば、LinkerIncludes.cs)、次のコードを追加します。

public class LinkerIncludes { 
    public void Include() { 
     var x = new System.ComponentModel.ReferenceConverter (typeof(void)); 
    } 
} 
+0

「pageTypeは、指定されたコンテキストでは無効な型です」と表示されます。 私はこの作業を行う方法を知らない。あなたが与えた解決策はうまくいくかのように見えますが、私はページ変数の内容を公開したいと思います。 –

+0

@CalvinBootsmanそれは私のために働いているので、私はあなたのためにそれを働かせることができると確信しています。 'Type'を' Button'コンストラクタに渡そうとしましたか、 'string'を使って型を作成しようとしましたか?私はあなたが 'MainLink'に' Type'を渡したときに 'button.MainLink(" Some Name "、" SomePage "、typeof(SomePage))'のように 'Type'を渡すときに前者を試してみます。編集:コードを振り返ってみたら、NavigationPageコンストラクタの代わりにNavigation.PushAsync()に直接ページタイプを渡していますが、違いはありません。どのラインが故障していますか? – hvaughan3

+0

@CalvinBootsman 'typeof(SomePage)'を使うときは、実際の型だけを渡すだけです。 'GetType()'を使用する場合は、 '(new SomePage).GetType()'のような型のインスタンスにアタッチする必要があります。 – hvaughan3

関連する問題