2016-07-11 8 views
1

Ich habe ein Textfeld mit einem Standardtext. Wenn ich das Textfeld scharfstelle, wird es gelöscht, so dass ich schreiben kann, und wenn ich nicht fokussiere, ohne etwas zu schreiben, erscheint der Standardtext wieder.Leere Textbox auf Mousclick in Kombination mit Sprachwechsel in WPF

Ich habe auch zwei Radiobuttons für die Auswahl der Sprache. Die Sprachen werden als XAML-Ressourcendateien bereitgestellt, und der Standardtext in der Textbox ist über DynamicResource mit dem Text verbunden.

Mein Problem ist, dass die Änderung der Sprache nur funktioniert, solange ich das Textfeld nicht fokussiert habe. Wenn ich das Textfeld fokussiere und es dann unfokussiere, ohne etwas zu ändern, ändert das Textfeld seine Sprache nicht mehr.

Ich vermute, dass, sobald es geändert (gelöscht) ist es nicht mehr mit der dynamischen Ressource verknüpft ist, weil WPF meine OnFocus-Änderungen als Benutzereingabe betrachtet, aber ich kann nicht herausfinden, wie man das umgehen und machen es ändert die Sprache, selbst wenn ich auf das Textfeld geklickt habe.

Das zweite Textfeld hat kein Fokusverhalten und in diesem funktioniert die Sprachumschaltung so, wie sie sollte, d. H. Sie ändert die Sprache, solange ich nicht wirklich etwas geschrieben habe.

Mainwindow XAML:

<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> 

MainWindows 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); 
    } 
} 
} 

En Sprache 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 Sprache 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> 

Antwort

0

Ja, wenn Sie in Codebehind TextBox.Text festlegen, weiß der Text nicht mehr, dass es einen Wert von der Reressource nehmen muss. Um es zu vermeiden, können Sie den Text mit reinem XAML mit Triggern ändern.

entfernen TextBox der Event-Handler und einen Stil wie folgt hinzu:

<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>