Динамически устанавливайте текстовую привязку текстового блока

StackOverflow https://stackoverflow.com/questions/2542814

  •  23-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь написать многоязычное приложение в Silverlight 4.0, и я на том этапе, когда я могу начать заменять свой статический текст динамическим текстом из файла SampleData xaml.Вот что у меня есть:

Моя база данных

<SampleData:something xmlns:SampleData="clr-namespace:Expression.Blend.SampleData.MyDatabase" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
  <SampleData:something.mysystemCollection>
    <SampleData:mysystem ID="1" English="Menu" German="Menü" French="Menu" Spanish="Menú" Swedish="Meny" Italian="Menu" Dutch="Menu" />
  </SampleData:something.mysystemCollection>
</SampleData:something>

Мой пользовательский контроль

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"
    x:Class="Something.MyUC" d:DesignWidth="1000" d:DesignHeight="600">
    <Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource MyDatabase}}">
        <Grid Height="50" Margin="8,20,8,0" VerticalAlignment="Top" d:DataContext="{Binding mysystemCollection[1]}" x:Name="gTitle">
            <TextBlock x:Name="Title" Text="{Binding English}" TextWrapping="Wrap" Foreground="#FF00A33D" TextAlignment="Center" FontSize="22"/>
        </Grid>
    </Grid>
</UserControl>

Как вы можете видеть, у меня есть 7 языков, с которыми я хочу разобраться.Прямо сейчас это отлично загружает английскую версию моего текста.Я потратил большую часть сегодняшнего дня, пытаясь выяснить, как изменить привязку в моем коде, чтобы поменять ее местами, когда мне нужно (допустим, когда я меняю язык через выпадающий список).

Это было полезно?

Решение

Вы идете по этому пути неправильно.Наилучшей практикой для локализации в Silverlight является использование файлов ресурсов, содержащих переведенные ключевые слова.Вот еще немного информации об этом:

http://msdn.microsoft.com/en-us/library/cc838238%28VS.95%29.aspx

Редактировать:

Вот пример, в котором я использую вспомогательный класс для хранения переведенных строк.Затем эти переводы можно было бы загрузить практически из любого места.Статические файлы ресурсов, xml, база данных или что-то еще.Я делал это в спешке, поэтому получилось не очень стабильно.И он переключается только между английским и шведским языками.

XAML:

<UserControl x:Class="SilverlightApplication13.MainPage"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:local="clr-namespace:SilverlightApplication13"
             mc:Ignorable="d"
             d:DesignWidth="640"
             d:DesignHeight="480">

    <UserControl.Resources>
        <local:TranslationHelper x:Key="TranslationHelper"></local:TranslationHelper>
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot">
        <StackPanel>

            <TextBlock Margin="10"
                       Text="{Binding Home, Source={StaticResource TranslationHelper}}"></TextBlock>

            <TextBlock Margin="10"
                       Text="{Binding Contact, Source={StaticResource TranslationHelper}}"></TextBlock>

            <TextBlock Margin="10"
                       Text="{Binding Links, Source={StaticResource TranslationHelper}}"></TextBlock>

            <Button Content="English"
                    HorizontalAlignment="Left"
                    Click="BtnEnglish_Click"
                    Margin="10"></Button>

            <Button Content="Swedish"
                    HorizontalAlignment="Left"
                    Click="BtnSwedish_Click"
                    Margin="10"></Button>
        </StackPanel>
    </Grid>
</UserControl>

Код, лежащий в основе + класс TranslationHelper:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Threading;
using System.ComponentModel;

namespace SilverlightApplication13
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();

            //Default
            (this.Resources["TranslationHelper"] as TranslationHelper).SetLanguage("en-US");
        }

        private void BtnEnglish_Click(object sender, RoutedEventArgs e)
        {
            (this.Resources["TranslationHelper"] as TranslationHelper).SetLanguage("en-US");
        }

        private void BtnSwedish_Click(object sender, RoutedEventArgs e)
        {
            (this.Resources["TranslationHelper"] as TranslationHelper).SetLanguage("sv-SE");
        }
    }

    public class TranslationHelper : INotifyPropertyChanged
    {
        private string _Contact;

        /// <summary>
        /// Contact Property
        /// </summary>
        public string Contact
        {
            get { return _Contact; }
            set
            {
                _Contact = value;
                OnPropertyChanged("Contact");
            }
        }

        private string _Links;

        /// <summary>
        /// Links Property
        /// </summary>
        public string Links
        {
            get { return _Links; }
            set
            {
                _Links = value;
                OnPropertyChanged("Links");
            }
        }

        private string _Home;

        /// <summary>
        /// Home Property
        /// </summary>
        public string Home
        {
            get { return _Home; }
            set
            {
                _Home = value;
                OnPropertyChanged("Home");
            }
        }



        public TranslationHelper()
        {
            //Default
            SetLanguage("en-US");
        }

        public void SetLanguage(string cultureName)
        {
            //Hard coded values, need to be loaded from db or elsewhere

            switch (cultureName)
            {
                case "sv-SE":
                    Contact = "Kontakt";
                    Links = "Länkar";
                    Home = "Hem";
                    break;

                case "en-US":
                    Contact = "Contact";
                    Links = "Links";
                    Home = "Home";
                    break;

                default:
                    break;
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

Другие советы

Похоже, вы ищете код, подобный этому:

Title.SetBinding(TextProperty, new Binding { Path = new PropertyPath(language) });

Все, что он делает, это создает новую привязку для запрошенного вами языка и использует ее для замены старой привязки для свойства Text заголовка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top