2017-06-01 81 views
1

在xamarin-forms應用程序中, 我想更改左側菜單的寬度對於android應用程序。在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); } 
    } 
    } 

現在Android應用程序代碼。

[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); 
     } 
    }   
} 

上面的代碼不起作用。 請分享如何更改Android的ap的MasterDetailPage的寬度?

回答

1

您所提供的代碼實際工作,問題是,現在this.Element不外露,通常我們可以通過覆蓋OnElementChanged方法得到的MyMasterDetailPage實例,問題是AddView這裏早於OnElementChanged調用。

目前,我便無法找到一個優雅的方式在MyMasterDetailPage定義BindableProperty並獲得AddView情況下,本屬性的值,但我們可以在渲染器的代碼中直接設置,例如:

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); 
     } 
    }   
}