是否可以为Xamarin Forms中的标记扩展创建全局引用?
我正在使用标记扩展来提供本地化,并且希望一次注册名称空间,而不是在每个视图中注册。
例如,这是一个简单的页面:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Views.Home"
xmlns:i18n="clr-namespace:App.Globalization">
<ContentPage.Content>
<StackLayout HorizontalOptions="Fill" VerticalOptions="Center">
<Label Text="{i18n:Translate Welcome}"
HorizontalOptions="Center"/>
</StackLayout>
</ContentPage.Content>
</ContentPage>
我要执行的操作不是要求每个页面都包含xmlns:i18n
名称空间,而是要在全局范围内包含它。
答案 0 :(得分:0)
简短答案:否。除非您切换了xmlns定义,否则这是不可能的。另外请注意,这是XML的限制,而不仅仅是XAML。
唯一的方法是使用XmlnsDefinitionAttribute
。 XAML解析器(编译时和运行时)都在程序集上寻找这些属性以收集默认的全局命名空间声明,就像following line in AssemblyInfo
in Xamarin.Forms.Core一样。
[assembly: XmlnsDefinition("http://xamarin.com/schemas/2014/forms", "Xamarin.Forms")]
您可以找到其中一些解析方法here。
上面的行加上此属性
您的自定义XAML页面/视图中默认包含的xmlns =“ http://xamarin.com/schemas/2014/forms”
允许您直接使用ContentPage
,StackLayout
,Grid
等控件,而无需指定{{1 }}命名空间
现在,您可以看到XmlnsDefinitionAttribute
和XmlTypeExtensions都被标记为内部。因此,没有简单的方法可以解决它。
您可以尝试按以下方式切换xmlns命名空间定义(请注意,我仅出于说明目的共享此内容)。这将使您不必为Xamarin.Forms
指定前缀。
TranslateExtension
答案 1 :(得分:-1)
不。 C#代码也是如此-您可以全局声明使用某些名称空间吗?当然不是。