【问题标题】:WPF - How to pass string to xaml from c#?WPF - 如何从 c# 将字符串传递给 xaml?
【发布时间】:2020-06-19 04:58:46
【问题描述】:

我正在使用“ini”文件进行本地化。 但我不知道如何将字符串从 c# 传递给 XAML

我是这样用 c# 做的:

using System. Windows;
using IniHandler;

namespace BMSound
{
    /// <summary>
    /// Interaction logic for AboutWindow.xaml
    /// </summary>
    public partial class AboutWindow : Window
    {
        public AboutWindow()
        {
            InitializeComponent();

            SaveINI ini = new SaveINI(SettingLoc.settingsFilePath());
            productName.Text = ini.Read("General", "ProductName");
            productVersion.Text = ini.Read("General", "Version");

            Lang lang = new Lang();
            this.Title = lang.Get("Titles", "About");
        }
    }
}

但我认为这不是最好的方法。而且我不知道在 XAML 中该怎么做

<TextBlock TextAlignment="Center">
    <!--Product Name Here-->
</TextBlock>

我是 XAML 的新手。使用 WinForms 很容易 :(

【问题讨论】:

  • 我同意这不是最好的方法,但它是唯一的方法,除非你想重新设计和重写整个 WPF 项目为MVVM跨度>
  • 查看 wpf 中的数据绑定并查看此how-to-create-a-simple-binding

标签: c# wpf


【解决方案1】:

要在 XAML 中完全做到这一点,您需要更多地转向 MVVM 方法。您可以为 xaml 编写 markup extensions 并使用它们来提供绑定到 f.e. 的数据。一些“翻译经理”。

每次语言更改时,您都需要通知标记扩展中使用的绑定以更新自身。

这使您可以执行以下操作:

<TextBlock Text="{l:Translator SomeMeaningfullID}"/>

在您的 Xaml 中,通过 MarkupExtension 的魔法,给定 ID 的翻译将被替换。

如果您在 Google 上搜索 C# markup extensions translation site:stackoverflow.com,您会发现很多帖子,您可以阅读以获取更多深入信息:

还有微软的资源:

或其他甚至涉及使用 MarkupExtensions 进行翻译的人:

有些链接是异地的 - 如果它们在未来变得陈旧,这将无济于事。不过,现场链接可以帮助您。

【讨论】:

    【解决方案2】:

    这适用于 ViewModel 中的索引器属性。创建带有索引的属性,在 XAML 中您可以像访问数组一样访问该属性。

    public class InfoViewModel : BaseViewModel
    {
        private ResourceStringProvider _language;
    
        /// <summary>
        /// Gets a bindable indexed property to load localized text resources.
        /// In Xaml one can use it like this:
        /// <code>
        /// Text="{Binding Language[MyTextResource]}"
        /// </code>
        /// </summary>
        public ResourceStringProvider Language
        {
            get { return _language ?? (_language = new ResourceStringProvider()); }
        }
    
        /// <summary>
        /// Helper class which provides an indexer property to the language resources.
        /// </summary>
        public class ResourceStringProvider
        {
            /// <summary>
            /// Gets a given localized text resource.
            /// </summary>
            /// <param name="id">Name of the text resource.</param>
            /// <returns>Localized text resource.</returns>
            public string this[string id]
            {
                get
                {
                    // return the localized text for the given id
                    ...
                }
            }
        }
    }
    

    访问视图中的语言资源:

    <Button ToolTip="{Binding Language[back]}"></Button>
    

    【讨论】:

      猜你喜欢
      • 2013-07-22
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 2011-11-26
      相关资源
      最近更新 更多