2017-06-01 15 views
1

xamarin-formsのアプリケーションでは、 アンドロイドアプリのために横幅を変更したいと思います。xamarin-formsのandroidのMasterDetailPageのマスターの幅を変更してください。

私はコード

class MyMasterDetailPage : MasterDetailPage 
{ 
    public static readonly BindableProperty DrawerWidthProperty = BindableProperty.Create<MyMasterDetailPage, int>(p => p.DrawerWidth, default(int)); 

    public int DrawerWidth 
    { 
     get { return (int)GetValue(DrawerWidthProperty); } 
     set { SetValue(DrawerWidthProperty, value); } 
    } 
    } 

以下あたり今アンドロイドアプリのコードのように幅変更しようとしています。

[assembly: Xamarin.Forms.ExportRenderer(typeof(Xamarin.Forms.MasterDetailPage), typeof(MyMasterDetailRenderer))] 
class MyMasterDetailRenderer : MasterDetailRenderer 
{ 
    bool firstDone; 

    public override void AddView(View child) 
    { 
     if (firstDone) 
     { 
      MyMasterDetailPage page = (MyMasterDetailPage)this.Element; 
      LayoutParams p = (LayoutParams)child.LayoutParameters; 
      p.Width = page.DrawerWidth; 
      base.AddView(child, p); 
     } 
     else 
     { 
      firstDone = true; 
      base.AddView(child); 
     } 
    }   
} 

上記のコードは機能しません。 アンドロイドAPのMasterDetailPageの幅を変更する方法についてのアイデアを教えてください。あなたが提供されているコードは、実際に動作する

答えて

1

が、問題は今公開されていないthis.Element、通常我々はOnElementChangedメソッドを上書きすることによってMyMasterDetailPageのインスタンスを取得することができるということです、問題はここにAddViewが早くOnElementChangedよりも呼ばれているということです。

現在、私はMyMasterDetailPageBindablePropertyを定義し、AddViewイベントでこのプロパティの値を取得するためのエレガントな方法を見つけるcould'tが、我々は例えば、レンダリングのコードで直接設定することができます

if (firstDone) 
{ 
    LayoutParams p = (LayoutParams)child.LayoutParameters; 
    p.Width = 300; 
    base.AddView(child, p); 
} 
else 
{ 
    firstDone = true; 
    base.AddView(child); 
} 

場合私はここでより良い解決策を見つけることができます、私はこの答えを更新するために戻ってきます。

+0

p.Width = 300 not working。静的な幅を適用しても適用されない場合は、アプリケーション – user2960398

+0

@ user2960398には影響しません。あなたのxfバージョンを教えてもらえますか?それは私の側では機能しますが、pclで定義されたプロパティは機能しません。 –

+0

これはモバイルでは機能していますが、タブレットでは機能していません – user2960398

1
[assembly: Xamarin.Forms.ExportRenderer(typeof(Xamarin.Forms.MasterDetailPage), typeof(MyMasterDetailRenderer))] 
class MyMasterDetailRenderer : MasterDetailRenderer 
{ 
    bool firstDone; 

    public override void AddView(View child) 
    { 
     if (firstDone) 
     { 
      var visualElementRenderer = this as IVisualElementRenderer; 
      var element = visualElementRenderer.Element; 
      MyMasterDetailPage page = (MyMasterDetailPage)element; 
      LayoutParams p = (LayoutParams)child.LayoutParameters; 
      p.Width = page.DrawerWidth; 
      base.AddView(child, p); 
     } 
     else 
     { 
      firstDone = true; 
      base.AddView(child); 
     } 
    }   
} 
関連する問題