LoadFromXAML 不适用于自定义命名空间
LoadFromXAML does not work with custom namespaces
我正在开发一个需要从网络服务器下载和显示 XAML-代码的应用程序。到目前为止,我的代码按预期工作,但现在我需要显示一个 WebView,它需要访问 GPS 数据(可以与 chrome-浏览器一起使用 android)。
我测试了实施和一切。在应用程序代码中编译 XAML-Code 时,一切都很顺利。即使 XAML-Hot-Reload 也能正常工作,但只要我尝试使用以下代码加载我的内容页面:
public static class GUIFramework
{
public static readonly string PRE_FRAMEWORK_XAML = "<ContentPage xmlns=\"http://xamarin.com/schemas/2014/forms\" xmlns:x=\"http://schemas.microsoft.com/winfx/2009/xaml\" xmlns:local=\"clr-namespace:Buerger_App.Renderer;assembly=Buerger_App\" x:Class=\"Buerger_App.Views.Framework\"><ContentPage.Content>";
public static readonly string POST_FRAMEWORK_XAML = "</ContentPage.Content></ContentPage>";
/// <summary>
/// This Dictionary is used for caching all of the generated CententPages in the memory.
/// This is needed due to the Page-XAML-Code needs to be compiled JIT and this can cause noticable delay.
/// The Caching automatically jumps in after a page was loaded once.
/// </summary>
private static Dictionary<string, ContentPage> CachedContentPages = new Dictionary<string, ContentPage>();
/// <summary>
/// Loads the given XAML string as a new ContentPage and binds the Framework Binding-Context
/// </summary>
/// <param name="XAML_Content">A string representing the XAML formatted code</param>
/// <returns>The newly created ContentPage</returns>
public static ContentPage LoadFramework(string XAML_Content, string Title = "")
{
string pre_XAML = PRE_FRAMEWORK_XAML;
if (Title != "")
{
pre_XAML = pre_XAML.Replace("<ContentPage ", "<ContentPage Title=\"" + Title + "\" ");
}
string FinalXAML = pre_XAML + XAML_Content + POST_FRAMEWORK_XAML;
ContentPage ContentPage = null;
// Use caching and read the XAML live from the phone and/or cache
string hash = SHA256Hash.GetHash(FinalXAML);
if (CachedContentPages.ContainsKey(hash))
ContentPage = CachedContentPages[hash];
else
{
ContentPage = new ContentPage().LoadFromXaml(FinalXAML);
CachedContentPages.Add(hash, ContentPage);
}
ContentPage.BindingContext = new FrameworkViewModel();
return ContentPage;
}
// More code ...
}
我尝试加载以下 XAML-代码(完整的 XAML-代码是使用 LoadFramework
-函数构建的):
<StackLayout>
<Image Source="logo_wide.jpg" Margin="0,0,0,25"/>
<local:GeoWebView x:Name="WebView" Margin="10,0,10,0" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Source="https://google.de" />
</StackLayout>
LoadFromXAML-扩展运行没有任何错误(没有抛出异常)。它只跳过创建我的自定义 GeoWebView(我可以在调试器中新创建的 ContentPage 的子项中验证(ContentPage 只有 1 个子项,这是在我的自定义 WebView 之前创建的图像))。
好的,所以我摆弄了一下,找到了我的解决方案。
也描述了我遇到的问题 here。提到将 assembly-key 添加到应该动态加载的 XAML-code 中的名称空间的答案通常是正确的,但我在原来的问题中做错了(我添加了 assembly-key 但有一个incrorrect assembly-name).
我测试的问题是,我输入了 Buerger_App
作为程序集,它是我的默认命名空间而不是我的 assembly-name。我的 assembly-name 是 Buerger App
.
更正 XAML-code 后,它开始按预期工作。
我正在开发一个需要从网络服务器下载和显示 XAML-代码的应用程序。到目前为止,我的代码按预期工作,但现在我需要显示一个 WebView,它需要访问 GPS 数据(可以与 chrome-浏览器一起使用 android)。 我测试了实施和一切。在应用程序代码中编译 XAML-Code 时,一切都很顺利。即使 XAML-Hot-Reload 也能正常工作,但只要我尝试使用以下代码加载我的内容页面:
public static class GUIFramework
{
public static readonly string PRE_FRAMEWORK_XAML = "<ContentPage xmlns=\"http://xamarin.com/schemas/2014/forms\" xmlns:x=\"http://schemas.microsoft.com/winfx/2009/xaml\" xmlns:local=\"clr-namespace:Buerger_App.Renderer;assembly=Buerger_App\" x:Class=\"Buerger_App.Views.Framework\"><ContentPage.Content>";
public static readonly string POST_FRAMEWORK_XAML = "</ContentPage.Content></ContentPage>";
/// <summary>
/// This Dictionary is used for caching all of the generated CententPages in the memory.
/// This is needed due to the Page-XAML-Code needs to be compiled JIT and this can cause noticable delay.
/// The Caching automatically jumps in after a page was loaded once.
/// </summary>
private static Dictionary<string, ContentPage> CachedContentPages = new Dictionary<string, ContentPage>();
/// <summary>
/// Loads the given XAML string as a new ContentPage and binds the Framework Binding-Context
/// </summary>
/// <param name="XAML_Content">A string representing the XAML formatted code</param>
/// <returns>The newly created ContentPage</returns>
public static ContentPage LoadFramework(string XAML_Content, string Title = "")
{
string pre_XAML = PRE_FRAMEWORK_XAML;
if (Title != "")
{
pre_XAML = pre_XAML.Replace("<ContentPage ", "<ContentPage Title=\"" + Title + "\" ");
}
string FinalXAML = pre_XAML + XAML_Content + POST_FRAMEWORK_XAML;
ContentPage ContentPage = null;
// Use caching and read the XAML live from the phone and/or cache
string hash = SHA256Hash.GetHash(FinalXAML);
if (CachedContentPages.ContainsKey(hash))
ContentPage = CachedContentPages[hash];
else
{
ContentPage = new ContentPage().LoadFromXaml(FinalXAML);
CachedContentPages.Add(hash, ContentPage);
}
ContentPage.BindingContext = new FrameworkViewModel();
return ContentPage;
}
// More code ...
}
我尝试加载以下 XAML-代码(完整的 XAML-代码是使用 LoadFramework
-函数构建的):
<StackLayout>
<Image Source="logo_wide.jpg" Margin="0,0,0,25"/>
<local:GeoWebView x:Name="WebView" Margin="10,0,10,0" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Source="https://google.de" />
</StackLayout>
LoadFromXAML-扩展运行没有任何错误(没有抛出异常)。它只跳过创建我的自定义 GeoWebView(我可以在调试器中新创建的 ContentPage 的子项中验证(ContentPage 只有 1 个子项,这是在我的自定义 WebView 之前创建的图像))。
好的,所以我摆弄了一下,找到了我的解决方案。 也描述了我遇到的问题 here。提到将 assembly-key 添加到应该动态加载的 XAML-code 中的名称空间的答案通常是正确的,但我在原来的问题中做错了(我添加了 assembly-key 但有一个incrorrect assembly-name).
我测试的问题是,我输入了 Buerger_App
作为程序集,它是我的默认命名空间而不是我的 assembly-name。我的 assembly-name 是 Buerger App
.
更正 XAML-code 后,它开始按预期工作。