Xamarin.forms 如何使MarkupExtension在Xaml中可见
我正在使用Xamarin.Forms进行一个项目 我有一个在PCL中定义的文本翻译的MarkupExtension,它是 公共(因此应在PCL外可见)和 还有一个用于PCL初始化的静态类,并且在App constructor中调用了它的Init方法 分机代码: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
[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" />