Xamarin.forms 如何使MarkupExtension在Xaml中可见

Xamarin.forms 如何使MarkupExtension在Xaml中可见,xamarin.forms,markup-extensions,Xamarin.forms,Markup Extensions,我正在使用Xamarin.Forms进行一个项目 我有一个在PCL中定义的文本翻译的MarkupExtension,它是 公共(因此应在PCL外可见)和 还有一个用于PCL初始化的静态类,并且在App constructor中调用了它的Init方法 分机代码: [ContentProperty("Text")] public class TranslateExtension : IMarkupExtension { readonly CultureInfo ci

我正在使用Xamarin.Forms进行一个项目

我有一个在PCL中定义的文本翻译的MarkupExtension,它是 公共(因此应在PCL外可见)和 还有一个用于PCL初始化的静态类,并且在App constructor中调用了它的Init方法

分机代码:

 [ContentProperty("Text")]
    public class TranslateExtension : IMarkupExtension
    {
        readonly CultureInfo ci;
        const string ResourceId = "GymHeroViews.Resources.AppResources";        

        public TranslateExtension()
        {
            ci = DependencyService.Get<ILocalize>().GetCurrentCultureInfo();
        }

        public string Text { get; set; }

        public object ProvideValue(IServiceProvider serviceProvider)
        {
            if (Text == null)
                return "";

            ResourceManager resmgr = new ResourceManager(ResourceId
                                , typeof(TranslateExtension).GetTypeInfo().Assembly);

            var translation = resmgr.GetString(Text, ci);

            if (translation == null)
            {
#if DEBUG
                throw new ArgumentException(
                    String.Format("Key '{0}' was not found in resources '{1}' for culture '{2}'.", Text, ResourceId, ci.Name),
                    "Text");
#else
                translation = Text;
#endif
            }
            return translation;
        }
    }
然后我定义了一个按钮:

<Button x:Name="Excersise1GridButton" Text="{t:Translate Excersise1GridButton}" Grid.Row="0" Grid.Column="1" />

对我来说,一切看起来都应该如此,但我有一个例外:

Xamarin.Forms.Xaml.XamlParseException:类型TranslateExtension不是 在xmlns clr命名空间中找到:GymHero.Common;组件:GymHero.Common

我将感谢任何帮助。提前谢谢


Tomasz

在从Xaml调用加载DLL之前,应该在C#代码中调用库。由于Xaml解析和UI安装是通过System.Reflection在运行时进行的,所以您必须这样做。谢谢您的回答。我已经使用空静态方法Init向GymHero.Common.dll添加了一个静态类,并在引用Xaml中的扩展之前调用了该方法。不过,问题是我在上面的帖子中提到的例外。还有一件事。我刚刚向process explorer检查过,devenv.exe已加载GymHero.Common.dll,因此反射应该没有问题。问题的原因可能是什么?在从Xaml调用加载DLL之前,应该在C#代码中调用库。由于Xaml解析和UI安装是通过System.Reflection在运行时进行的,所以您必须这样做。谢谢您的回答。我已经使用空静态方法Init向GymHero.Common.dll添加了一个静态类,并在引用Xaml中的扩展之前调用了该方法。不过,问题是我在上面的帖子中提到的例外。还有一件事。我刚刚向process explorer检查过,devenv.exe已加载GymHero.Common.dll,因此反射应该没有问题。问题的原因可能是什么?
<Button x:Name="Excersise1GridButton" Text="{t:Translate Excersise1GridButton}" Grid.Row="0" Grid.Column="1" />