如何从包含视图的 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 错误阻止我看到它是正确的(因为我的应用程序仍在崩溃)。谢天谢地,这个错误现在正在处理中,现在我可以继续编码,因为我知道正确的语法。 :-)
这让我抓狂。我试图从我制作的基础 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 错误阻止我看到它是正确的(因为我的应用程序仍在崩溃)。谢天谢地,这个错误现在正在处理中,现在我可以继续编码,因为我知道正确的语法。 :-)