在xamarin-forms中更改Master of MasterDetailPage for android的宽度

时间:2017-06-01 06:17:51

标签: c# xamarin.android xamarin.forms

在xamarin表单应用程序中, 我想改变左侧菜单的宽度对于Android应用程序。

我尝试根据以下代码更改宽度

With Acon1
    .Provider = "Microsoft.ACE.OLEDB.12.0"
    .ConnectionString = "Data Source=" + ThisWorkbook.Sheets(1).Range("V24").Value & _ 
";User ID=admin;Password=" 'Password
    .Open
End With

现在是Android应用程序代码。

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

上面的代码不起作用。 请分享关于如何更改MasterDetailPage for android ap?

的宽度的想法

2 个答案:

答案 0 :(得分:1)

您提供的代码实际上有效,问题是this.Element现在没有公开,通常我们可以通过覆盖MyMasterDetailPage方法来获取OnElementChanged的实例,问题是AddView 1}}此处的调用时间早于OnElementChanged

目前我找不到在BindableProperty中定义MyMasterDetailPage的优雅方式,并在AddView事件中获取此属性的值,但我们可以直接在渲染器的代码中设置它例如:

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

如果我能在这里找到更好的解决方案,我会回来更新这个答案。

答案 1 :(得分: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);
        }
    }        
}