Xamarin.Forms MasterDetailPage의 Master 너비 변경 (iOS)

MasterDetailPage에 표시되는 Master의 너비는 크기가 고정되어 있습니다.
이것을 UI 측에서 변경할 수 있는 구조가 필요하다고 생각해, MasterDetailPage 의 확장 클래스를 작성했습니다.

완성 이미지는 이쪽




MasterDetail 클래스 확장



표준으로 폭을 변경하기 위한 프로퍼티가 제공되어 있지 않기 때문에, MasterDetailPage 클래스를 상속해, 프로퍼티를 추가합니다.
public static readonly BindableProperty MasterFractionProperty =
    BindableProperty.Create(
        propertyName: nameof(MasterFraction),
        returnType: typeof(double),
        declaringType: typeof(VariableMasterDetailPage),
        defaultValue: 0.0,
        defaultBindingMode: BindingMode.TwoWay,
        propertyChanged: OnMasterFractionChanged);

public double MasterFraction
{
    get { return (double)GetValue(MasterFractionProperty); }
    set { SetValue(MasterFractionProperty, value); }
}

protected static void OnMasterFractionChanged(BindableObject bindable, object oldValue, object newValue)
{
    var page = (VariableMasterDetailPage)bindable;

    var newFraction = (double)newValue;
    if (newFraction < page.MinimumFraction || page.MaximumFraction < newFraction)
        throw new ArgumentOutOfRangeException();

    var oldFraction = (double)oldValue;
    if (oldFraction.Equals(newFraction) == false)
    {
        page.MasterFraction = newFraction;
        page.OnPropertyChanged(nameof(page.MasterFraction));
    }
}

CustomRenderer



TabletMasterDetailRenderer를 상속한 CustomRenderer를 iOS 프로젝트에 추가합니다. MaximumPrimaryColumnWidth를 변경하는 것이 포인트입니다.
using System;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using UIKit;
using VariableMaster;
using VariableMaster.Controls;
using VariableMaster.iOS;

[assembly: ExportRenderer(typeof(VariableMasterDetailPage), typeof(VarriableMasterDetailPageRenderer))]

namespace VariableMaster.iOS
{
    public class VarriableMasterDetailPageRenderer : TabletMasterDetailRenderer
    {
        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            var page = e.NewElement as VariableMasterDetailPage;
            if (page != null)
            {
                page.PropertyChanged += (sender, args) =>
                {
                    if (args.PropertyName == "MasterFraction")
                    {
                        MaximumPrimaryColumnWidth = (nfloat)(page.Width * page.MasterFraction / 100);
                        PreferredPrimaryColumnWidthFraction = (nfloat)page.MasterFraction / 100;
                    }
                };
            }

            base.OnElementChanged(e);
        }
    }
}

전체 소스 코드는 여기 리포지토리를 참조하십시오. 이상한 곳이 있으면 PR 잘 부탁드립니다.
htps : // 기주 b. 코 m / s

좋은 웹페이지 즐겨찾기