2017-06-01 65 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); 
     } 
    }   
}