Kotak teks kosong di mouseclick dikombinasikan dengan perubahan bahasa di WPF

Saya memiliki kotak teks dengan teks default. Saat saya memfokuskan kotak teks, kotak teks tersebut dihapus sehingga saya dapat menulis, dan jika saya tidak fokus tanpa menulis apa pun, teks default akan muncul kembali.

Saya juga memiliki dua tombol radio untuk memilih bahasa. Bahasa disediakan sebagai file sumber daya xaml dan teks default di kotak teks dihubungkan ke teks tersebut menggunakan DynamicResource.

Masalah saya adalah perubahan bahasa hanya berfungsi selama saya belum memfokuskan kotak teks. Jika saya memfokuskan kotak teks lalu menghilangkan fokusnya tanpa mengubah apa pun, kotak teks tersebut tidak lagi mengubah bahasa.

Saya kira itu karena setelah diubah (dihapus) itu tidak lagi ditautkan ke sumber daya dinamis, karena WPF menganggap perubahan fokus saya sebagai masukan pengguna, tetapi saya tidak tahu cara menyiasatinya dan membuatnya bahkan mengubah bahasa jika saya sudah mengklik kotak teks.

Kotak teks kedua tidak memiliki perilaku fokus apa pun dan di dalamnya perubahan bahasa berfungsi sebagaimana mestinya, yaitu mengubah bahasa selama saya belum benar-benar menulis sesuatu.

xaml Jendela Utama:

<Window x:Class="Textbox_langauge_buggseek.MainWindow"
    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:Textbox_langauge_buggseek"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <TextBox x:Name="TextBox" HorizontalAlignment="Left" Height="46" Margin="84,55,0,0" TextWrapping="Wrap" Text="{DynamicResource ResourceKey=TB}" VerticalAlignment="Top" Width="334" GotFocus="TextBox_GotFocus" LostFocus="TextBox_LostFocus"/>
    <TextBox x:Name="TextBox_Copy" HorizontalAlignment="Left" Height="46" Margin="84,123,0,0" TextWrapping="Wrap" Text="{DynamicResource ResourceKey=TB}" VerticalAlignment="Top" Width="334"/>
    <RadioButton x:Name="En" Content="En" GroupName="Lang" HorizontalAlignment="Left" Margin="391,216,0,0" VerticalAlignment="Top" Checked="En_Checked" IsChecked="True"/>
    <RadioButton x:Name="Se" Content="Se" GroupName="Lang" HorizontalAlignment="Left" Margin="391,234,0,0" VerticalAlignment="Top" Checked="Se_Checked"/>

</Grid>
</Window>

Windows Utama cs:

using System;
using System.Windows;
using System.Windows.Controls;

namespace Textbox_langauge_buggseek
{
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        SetLanguageDictionary();
    }

    //*****************************************************************************************

    private void TextBox_GotFocus(object sender, RoutedEventArgs e)
    {
        TextBox box = sender as TextBox;
        box.Text = box.Text == (string)this.Resources["TB"] ? string.Empty : box.Text;
    }

    private void TextBox_LostFocus(object sender, RoutedEventArgs e)
    {
        TextBox box = sender as TextBox;
        box.Text = box.Text == string.Empty ? (string)this.Resources["TB"] : box.Text;
    }

    //*****************************************************************************************

    private void En_Checked(object sender, RoutedEventArgs e)
    {
        SetLanguageDictionary("En");
    }

    private void Se_Checked(object sender, RoutedEventArgs e)
    {
        SetLanguageDictionary("Se");
    }

    //*****************************************************************************************

    private void SetLanguageDictionary(string language = "En")
    {
        ResourceDictionary dict = new ResourceDictionary();
        switch (language)
        {
            case "Se":
                dict.Source = new Uri("..\\Resources\\Se.xaml", UriKind.Relative);
                break;
            default:
                dict.Source = new Uri("..\\Resources\\En.xaml", UriKind.Relative);
                break;
        }
        this.Resources.MergedDictionaries.Add(dict);
    }
}
}

Dalam bahasa xaml:

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:system="clr-namespace:System;assembly=mscorlib">

<system:String x:Key="TB">Text in the TextBox!</system:String>

</ResourceDictionary>

Se bahasa xaml:

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:system="clr-namespace:System;assembly=mscorlib">

<system:String x:Key="TB">Text i textrutan!</system:String>

</ResourceDictionary>

person Stefan    schedule 11.07.2016    source sumber


Jawaban (1)


Ya, ketika Anda menyetel TextBox.Text di belakang kode, teks tidak tahu lagi bahwa ia harus mengambil nilai dari Rersource. Untuk menghindarinya anda bisa mengubah teks menggunakan XAML murni, dengan Triggers.

Hapus event handler TextBox dan tambahkan gaya seperti ini:

    <TextBox x:Name="TextBox"  HorizontalAlignment="Left" Height="46" Margin="84,55,0,0" TextWrapping="Wrap"  VerticalAlignment="Top" Width="334">
        <TextBox.Style>
            <Style TargetType="{x:Type TextBox}">
                <Style.Triggers>
                    <Trigger Property="IsFocused" Value="true">
                        <Setter Property="Text" Value="" />
                    </Trigger>
                    <Trigger Property="IsFocused" Value="false">
                        <Setter Property="Text" Value="{DynamicResource ResourceKey=TB}" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TextBox.Style>
    </TextBox>
person lena    schedule 13.01.2017