我已经创建了一个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中母版页的宽度。
答案 0 :(得分:3)
当我们查看Xamarin表单本身使用的MasterDetailRenderer
时,您会看到呈现的实际控件是MasterDetailControl
(https://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将覆盖任何模板。
因此,请复制粘贴MasterDetailControlStyle
(https://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>