如何从包含视图的 Xamarin Forms 基础 class 页面继承?

How to inherit from a Xamarin Forms base class Page with views in it?

这让我抓狂。我试图从我制作的基础 SettingsPage 继承,但它不起作用,而且我在任何地方都找不到如何做的例子。我发现的所有示例都涉及继承视图模型和其他非可视元素。特别是,我不确定您对派生页面中的 "Content=" 做了什么,因为基页已经设置了 "Content="。 MS doco on inheritance 说你不继承构造函数,但你可以使用 :base().

从它继承

我整理了一个配色方案选择器(在 amporis.xamarin.forms.colorpicker 上扩展),我想将其用作其他设置页面的基础(在我需要配色方案选择器和其他设置)。我有一个 class 库 CSettings,如果直接加载,CSettingsPage 可以很好地加载(其中包括 Content=SettingsGrid,所有内容都已加载到其中)- 一切都是 "public"。然后我有一个 TestBed 应用程序,并尝试创建一个 TBSettingsPage。在顶部我有

namespace TestBed {
    public class TBSettingsPage : CSettingsPage {...

(当然我已经引用了 DLL),并且我已经尝试了以下 3 种构造函数变体...

public TBSettingsPage():base() {}
public TBSettingsPage():base() { Content=SettingsGrid; }
public TBSettingsPage() { Content=SettingsGrid; }

每次我得到...

"Exception thrown: 'System.Runtime.InteropServices.COMException' in Xamarin.Forms.Platform.UAP.dll Error HRESULT E_FAIL has been returned from a call to a COM component." 在 Xamarin.Forms 初始化。

...这不是一条非常有用的错误消息。它基本上说 "that's not right" 没有告诉我什么不对也没有告诉我如何解决它(谷歌搜索它会出现各种各样的情况,其中 none 适用于我正在尝试做的事情)。 :-(

谁能告诉我如何从已经有视图的 BasePage 派生? (我看到了关于在构建页面之前使其不可见,然后使其可见的提示,但这没有帮助)。或者给我指出一个实现这种东西的地方的例子?

注意:我的 UI 是在 C# 中,而不是 XAML。如果相关的话,这也在 UWP 中。

谢谢, 唐纳德.

根据要求,这是来自 OnLaunched 的代码

受保护的覆盖 void OnLaunched(LaunchActivatedEventArgs e) {

        Frame rootFrame = Window.Current.Content as Frame;

        // Do not repeat app initialization when the Window already has content,
        // just ensure that the window is active
        if (rootFrame == null)
        {
            // Create a Frame to act as the navigation context and navigate to the first page
            rootFrame = new Frame();

            rootFrame.NavigationFailed += OnNavigationFailed;

            Xamarin.Forms.Forms.Init(e);

            if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
            {
                //TODO: Load state from previously suspended application
            }

            // Place the frame in the current Window
            Window.Current.Content = rootFrame;
        }

        if (rootFrame.Content == null)
        {
            // When the navigation stack isn't restored navigate to the first page,
            // configuring the new page by passing required information as a navigation
            // parameter
            rootFrame.Navigate(typeof(MainPage), e.Arguments);
        }
        // Ensure the current window is active
        Window.Current.Activate();
    }

所以我最终发现这完全是因为 UWP 中的一个错误给了我一个红鲱鱼 - 参见 https://github.com/xamarin/Xamarin.Forms/issues/9335。正确的语法是我说的第一个 - 即 public TBSettingsPage():base() {} - 但 UWP 错误阻止我看到它是正确的(因为我的应用程序仍在崩溃)。谢天谢地,这个错误现在正在处理中,现在我可以继续编码,因为我知道正确的语法。 :-)