在UWP中本地化XAML UI中的字符串

r7s23pms  于 2022-12-07  发布在  其他
关注(0)|答案(3)|浏览(148)

我在UWP应用的Resources.resw文件中有一个名为info_278的资源条目。我有3个场景需要使用此资源,但看起来我需要复制此资源以满足不同的场景。场景如下。
1.代码中的错误消息内容
var displayErrorOnPopup = ResourceHandler.Get("info_278");
1.来自XAML的TextBlock文字属性(看起来像是info_278.Text所需的新项目)
<TextBlock x:Uid="info_278" Margin="10,0,0,0" />
1.来自XAML的按钮内容属性(看起来像是需要新的项目,如info_278.Content
<Button x:Uid="info_278" Margin="10,0,0,0" />
如何在不复制.resw文件中的此资源的情况下继续?

z8dt9xmd

z8dt9xmd1#

避免重复的唯一方法是使用ResourceLoader在代码隐藏中设置字符串值。因为您可以直接访问目标控件的特定属性。如下所示:

var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView();
this.TextBlock.Text = resourceLoader.GetString("info_278");

如果您不打算在后面的代码中这样做,那么我不得不说,没有办法避免资源字符串的重复。您应该为不同的XAML场景添加info_278.Textinfo_278.Content

hc2pp10m

hc2pp10m2#

你可以创建一个标记扩展。我已经在WinUI 3中使用了这个,但是应该也可以在UWP中使用。

using Microsoft.UI.Xaml.Markup;
using Windows.ApplicationModel.Resources;

namespace MyApp;

[MarkupExtensionReturnType(ReturnType = typeof(string))]
public class StringResourceExtension : MarkupExtension
{
    private static readonly ResourceLoader _resourceLoader = new();

    public StringResourceExtension() { }

    public string Key { get; set; } = "";

    protected override object ProvideValue()
    {
        return _resourceLoader.GetString(Key);
    }
}

然后在XAML中:

...
local="using:MyApp"
...

<TextBlock Text="{local:StringResource Key=info_278}" />
<Button Content="{local:StringResource Key=info_278}" />
n3schb8v

n3schb8v3#

ButtonContent可以是TextBlock

<Button>
  <TextBlock x:Uid="MyTextId" Style="{StaticResource MyTextBlockStyle}" />
</Button>

相关问题