Xamarin表单中的全局标记扩展

时间:2018-07-30 19:50:30

标签: xaml xamarin.forms

是否可以为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名称空间,而是要在全局范围内包含它。

2 个答案:

答案 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

上面的行加上此属性

  

xmlns =“ http://xamarin.com/schemas/2014/forms”

您的自定义XAML页面/视图中默认包含的

允许您直接使用ContentPageStackLayoutGrid等控件,而无需指定{{1 }}命名空间

现在,您可以看到XmlnsDefinitionAttributeXmlTypeExtensions都被标记为内部。因此,没有简单的方法可以解决它。

您可以尝试按以下方式切换xmlns命名空间定义(请注意,我仅出于说明目的共享此内容)。这将使您不必为Xamarin.Forms指定前缀。

TranslateExtension

答案 1 :(得分:-1)

不。 C#代码也是如此-您可以全局声明使用某些名称空间吗?当然不是。