在 Xamarin.forms 中减少 UWP MasterDetailPage Master 的宽度

Reduce the width of Master of the MasterDetailPage for UWP in Xamarin.forms

我创建了一个 Xamarin 应用程序,我需要减少主从页面的主控宽度。 我遵循了一种方法来创建特定于 UWP 的自定义渲染器。下面是我的代码:

 [assembly: ExportRenderer(typeof(Xamarin.Forms.MasterDetailPage), typeof(CustomMasterDetailRenderer))]
    namespace VirtusContactManager.App.UWP.Renderer
    {
        public class CustomMasterDetailRenderer : VisualElementRenderer<Xamarin.Forms.MasterDetailPage, MasterDetailControl>
        {
            MasterDetailControl control = new MasterDetailControl();
            protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.MasterDetailPage> e)
            {
                base.OnElementChanged(e);
                control.Width = 120;
                SetNativeControl(control);
            }
            protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
            {
                control.Width = 120;
            }
        }
    }

我已经创建了上面的自定义渲染器。我面临的问题是我无法设置 control.Master 的值,因为它是一个 FrameworkElement 而我想要的是一个页面。
control.Width 设置整个页面的宽度,而不仅仅是主页的宽度。

我应该如何设置control.Master到一个页面。
如果这个方法不正确,请提出一个更好的方法来减少宽度UWP 中的母版页。

当我们查看 Xamarin Forms 本身中使用的 MasterDetailRenderer 时,您会看到呈现的实际控件是 MasterDetailControl ( https://github.com/xamarin/Xamarin.Forms/blob/365a60e745d447992e870dd6272226e6b11ec275/Xamarin.Forms.Platform.UAP/MasterDetailControl.cs ) 类型之一。

我们在这里面临的问题是,更改 Master 部分大小的实际 属性 无法访问,因为我们无法访问 [=12= 中的 SplitView 控件]. 通常你应该使用 OpenPaneLenght 属性 来调整大小( https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.splitview.openpanelength#Windows_UI_Xaml_Controls_SplitView_OpenPaneLength )。

但是!您可以做的是在用于 MasterDetailControl 的模板中设置 属性!如果您在应用级别提供自己的模板,XAML 将覆盖任何模板。

因此,从 MasterDetailControlStyle ( https://github.com/xamarin/Xamarin.Forms/blob/365a60e745d447992e870dd6272226e6b11ec275/Xamarin.Forms.Platform.UAP/MasterDetailControlStyle.xaml ) 复制粘贴 XAML 并将其粘贴到 UWP 项目的 App.Xaml 中的 ResourceDictionary 标记内. 最后要做的是为 SplitView 控件的 OpenPaneLength 属性 添加一个值。

就像这样 - 我在这里将其设置为 10 作为示例以表明它有效:

<Application
    x:Class="XFMasterDetailUWP.UWP.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:XFMasterDetailUWP.UWP"
    xmlns:uwp="using:Xamarin.Forms.Platform.UWP"
    RequestedTheme="Light">
    <Application.Resources>
        <ResourceDictionary>
            <Style TargetType="uwp:MasterDetailControl">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="uwp:MasterDetailControl">
                            <SplitView x:Name="SplitView"
                                       OpenPaneLength="10"
                                       IsPaneOpen="{Binding IsPaneOpen,RelativeSource={RelativeSource TemplatedParent},Mode=TwoWay}" DisplayMode="Overlay">
                                <SplitView.Pane>