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

时间:2018-06-18 12:47:00

标签: c# .net xamarin.forms xamarin.uwp custom-renderer

我已经创建了一个Xamarin应用程序,并且我需要减少Master-Detail页面的Master的宽度。 我已经按照一种方法来创建一个特定于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,我想要的是一个Page。
control.Width 设置整个页面的宽度,而不仅仅是Master。

如何将 control.Master 设置为页面。
如果这种方法不正确,请建议一种更好的方法来减少UWP中母版页的宽度。

1 个答案:

答案 0 :(得分:3)

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

我们在这里遇到的问题是,更改主要部分大小的实际属性不是accessibel,因为我们无法访问SplitView内的MasterDetailControl控件。 通常,您应该使用OpenPaneLenght属性来调整大小(https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.splitview.openpanelength#Windows_UI_Xaml_Controls_SplitView_OpenPaneLength)。

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

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

就像这样 - 我已将其设置为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>