WPF - Как передать строку в xaml из c#? - PullRequest
0 голосов
/ 19 июня 2020

Я работаю над локализацией с ini-файлами. Но я не знаю, как передать строки в XAML из c#

Я сделал это с 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 это было просто: (

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Это отлично работает со свойством индексатора в вашей 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>
0 голосов
/ 19 июня 2020

Чтобы сделать это полностью внутри XAML, вам потребуется перейти на подход MVVM. Вы можете написать расширения разметки для xaml и использовать их для предоставления данных, привязанных к некоторому «менеджеру переводов».

Каждый раз, когда язык меняется, вам нужно будет сигнализировать о том, что привязка, используемая в вашем расширении разметки, обновляется.

Это позволяет вам делать что-то вроде:

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

в вашем Xaml и с помощью magi c MarkupExtension перевод для данного идентификатора будет заменен.

Если вы загуглите C# markup extensions translation site:stackoverflow.com, вы найдете множество сообщений, которые вы можете прочитать для более подробной информации:

Есть также ресурсы Microsoft:

или другие, которые даже коснитесь использования MarkupExtensions для целей перевода:

Некоторые ссылки находятся вне сайта - если они go устареют в будущем, это не сильно поможет. Хотя ссылки на сайте могут вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...