Xamarin.Forms应用程序中的MasterDetailPage

Xamarin.Forms应用程序中的MasterDetailPage,xamarin.forms,xamarin.android,master-pages,master-detail,Xamarin.forms,Xamarin.android,Master Pages,Master Detail,是否可以在Xamarin.Forms中创建类似的侧菜单 如果您不想使用内置的“主/详细信息”滑出页面,因为它太宽且无法轻松调整大小,您可能需要使用滑出套件 它是一个免费的开源组件,应该允许您做您需要的事情 我搜索一个小菜单。将尺寸宽度修改为母版页 您可以在MasterDetailPageRenderer中更改Master页面的宽度 首先,在自定义MasterDetailPage类中创建一个BindableProperty: public class MyMasterDetailPage :

是否可以在
Xamarin.Forms
中创建类似的侧菜单


如果您不想使用内置的“主/详细信息”滑出页面,因为它太宽且无法轻松调整大小,您可能需要使用滑出套件

它是一个免费的开源组件,应该允许您做您需要的事情

我搜索一个小菜单。将尺寸宽度修改为母版页

您可以在
MasterDetailPageRenderer
中更改
Master
页面的宽度

首先,在自定义
MasterDetailPage
类中创建一个
BindableProperty

public class MyMasterDetailPage : MasterDetailPage
{
    public static readonly BindableProperty DrawerWidthProperty =
          BindableProperty.Create(
              "WidthRatio",
              typeof(int),
              typeof(MyMasterDetailPage),
              (float)0.2,
              propertyChanged: (bindable, oldValue, newValue) =>
              {
              });

    public float WidthRatio
    {
        get { return (float)GetValue(WidthRatioProperty); }
        set { SetValue(WidthRatioProperty, value); }
    }
}
其次,在
MasterDetailPageRenderer
中,将
MyMasterDetailPage
宽度设置如下:

[assembly: ExportRenderer(typeof(MyMasterDetailPage), typeof(MyMasterDetailPageRenderer))]
...
public class MyMasterDetailPageRenderer : MasterDetailPageRenderer
{
    protected override void OnElementChanged(VisualElement oldElement, VisualElement newElement)
    {
        base.OnElementChanged(oldElement, newElement);

        var width = Resources.DisplayMetrics.WidthPixels;

        var fieldInfo = GetType().BaseType.GetField("_masterLayout", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
        var _masterLayout = (ViewGroup)fieldInfo.GetValue(this);
        var lp = new DrawerLayout.LayoutParams(_masterLayout.LayoutParameters);

        MyMasterDetailPage page = (MyMasterDetailPage)newElement;
        lp.Width = (int)(page.WidthRatio * width);

        lp.Gravity = (int)GravityFlags.Left;
        _masterLayout.LayoutParameters = lp;
    }
}
public App()
{
    InitializeComponent();

    var mdp = new MyMasterDetailPage
    {
        Master = new MenuPage() { Title = "Master" },
        Detail = new ContentPage
        {
            BackgroundColor = Color.White,
            Title = "DetailPage",
            Content = new Label
            {
                Text = "DetailPage",
                HorizontalTextAlignment = TextAlignment.Center,
                VerticalTextAlignment = TextAlignment.Center,
            },
        },
        WidthRatio = 0.5f,
    };
    MainPage = mdp;
}
用法,在我的
App.xaml.cs
中,我将页面设置如下:

[assembly: ExportRenderer(typeof(MyMasterDetailPage), typeof(MyMasterDetailPageRenderer))]
...
public class MyMasterDetailPageRenderer : MasterDetailPageRenderer
{
    protected override void OnElementChanged(VisualElement oldElement, VisualElement newElement)
    {
        base.OnElementChanged(oldElement, newElement);

        var width = Resources.DisplayMetrics.WidthPixels;

        var fieldInfo = GetType().BaseType.GetField("_masterLayout", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
        var _masterLayout = (ViewGroup)fieldInfo.GetValue(this);
        var lp = new DrawerLayout.LayoutParams(_masterLayout.LayoutParameters);

        MyMasterDetailPage page = (MyMasterDetailPage)newElement;
        lp.Width = (int)(page.WidthRatio * width);

        lp.Gravity = (int)GravityFlags.Left;
        _masterLayout.LayoutParameters = lp;
    }
}
public App()
{
    InitializeComponent();

    var mdp = new MyMasterDetailPage
    {
        Master = new MenuPage() { Title = "Master" },
        Detail = new ContentPage
        {
            BackgroundColor = Color.White,
            Title = "DetailPage",
            Content = new Label
            {
                Text = "DetailPage",
                HorizontalTextAlignment = TextAlignment.Center,
                VerticalTextAlignment = TextAlignment.Center,
            },
        },
        WidthRatio = 0.5f,
    };
    MainPage = mdp;
}
更新: 关于
Xamarin.iOS
,受其启发,您可以参考,唯一需要做的事情是在中更改此行:


母版详细信息页面的左侧只是一个垂直堆栈布局,因此您可以根据需要设计它。请参阅此repo:谢谢@OrcusZ,@Himanshu Dwivedi,但这不是我要找的,我已经看到了此解决方案,但不是他的,我搜索了一个小菜单。将尺寸宽度修改为母版页