Laden...

TextBox Focus geben

Erstellt von sworddancer vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.998 Views
S
sworddancer Themenstarter:in
2 Beiträge seit 2007
vor 16 Jahren
TextBox Focus geben

Hallo zusammen,

ich stehe vor einem Problem und hoffe ihr könnt mir weiter helfen. Hoffe das ich jetzt auch im richtigen Topic bin. Also die benutzeroberfläche wird bei mir mit WPF gemacht und benutze das .net 3.5 Framework so jetzt aber zu meinem Problem

Ich möchte in einem Formular die Eingaben über Textboxen machen. Die TextBoxen sollen dem benutzer aber nicht als solche angezeigt werden. Die Textbox ist in einem DataTemplate welches von einem Label verwendet wird.


<DataTemplate x:Key="BlubTemplate">
  <TextBox Text="{Binding Path=Blub, UpdateSourceTrigger=PropertyChanged}" SelectionLength="10" Width="50" Margin="0" Name="TextBlub" Foreground="#FF07B523" Background="black" BorderBrush="black"  GotFocus="ChangeBackgroundColor" LostFocus="ResetBackgroundColor" />
   <DataTemplate.Triggers>
    <DataTrigger Binding="{Binding Path=Blub}" Value="0">
      <Setter Property="Foreground" Value="black" TargetName="TextBlub"/>
    </DataTrigger>
  </DataTemplate.Triggers>
</DataTemplate>

Das Label selbst ist in einem Border der Mehr Platz bietet als die TextBox einnimmt.


<Border Width="123" Height="95.139" Canvas.Left="152" Canvas.Top="110.723" BorderBrush="#FFFEFCFC" BorderThickness="1,1,1,1" x:Name="BlubBorder" MouseDown="EnterBlubValue">

Die Textbox selbst hat die gleiche Hintergrundfarbe und den gleichen BorderBrush wie der Border in welchem das Label ist. Jetzt möchte ich wenn ich irgendwoe auf den Border Clicke der TextBox den Focus geben. Dazu habe ich mich bei dem Border auf das Event MouseDown regestriert. Wenn diese Event auftritt möchte ich der TextBox den Focus geben. Dazu verwende ich folgenden Code


private void EnterBlubValue(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
  (TextBox)((DataTemplate)FindResource("BlubTemplate")).LoadContent()).Focus();
}

Wie oben bei dem DataTemplate beschrieben habe ich mich auch auf die beiden Events GotFocus und LostFocus regestriert.


((TextBox)e.OriginalSource).Background = Brushes.Gray;
((TextBox)e.OriginalSource).BorderBrush = Brushes.Gray;
if (((TextBox)e.OriginalSource).Name.Equals("TextBlub"))
  BlubBorder.Background = Brushes.Gray;

In der Got Focus funktion setzte ich die Hintergundfarbe des borders und der textbox auf Grau um dem Benutzer anzuzeigen das er dieses feld gerade editiert. Jetzt ist das interesante aber das ich durch die Funktion Focus ein event bekomme das die ListBox den Focus bekommt wenn ich diesen aber abrufe ist dieser auf false. Die Listbox ist auch nicht selektiert und ich kann nciht rein schreiben. Die Hintergrundfarbe des Borders ist Grau aber die der TextBox nicht. Das ganze Formular selbst ist in einem Tabcontrol und der Border ist in einem Canvas gespeichert. Ich hoffe jemand von euch kann mir bei diesem Problem helfen. Vielen dank schonmal im vorraus

MFG
sworddancer

6.862 Beiträge seit 2003
vor 16 Jahren

Also bei dem Got/LostFocus ist es schonmal viel einfacher Styles zu verwenden, dann brauchst du auch nich erst wieder umständlich aus den EventArgs dein Element raussuchen. Am geschicktesten wäre wohl einfach ein Trigger auf IsFocused und dort den Brush für den Fall das das Element den Focus hat setzen, und sobald er den Focus verliert wird ja automatisch der alte Brush gesetzt.

Jetzt ist das interesante aber das ich durch die Funktion Focus ein event bekomme das die ListBox den Focus bekommt wenn ich diesen aber abrufe ist dieser auf false. Sicher? Du musst mit dem Event Routing aufpassen. Wenn ein Element ein bestimmtes Event feuert, heißt es noch lange nicht das es der Auslöser war. Nehmen wir mal an du hast ne ListBox mit irgendwelchen Elementen als Items und hast nen Handler auf GotFocus bei der ListBox. Wenn du jetzt auf nen Item clickst, bekommt dieses den Focus und wirft das GotFocus Event. Und jetzt wandert das Event praktisch den ElementTree weiter rauf. Als nächstes wirft die ListBox das Event, danach der Parent der ListBox usw. Deshalb haben RoutedEventArgs auch Source und OriginalSource Properties wo man unterscheiden kann wo ein Event nun wirklich herkam.
Beschreib mal deinen VisualTree komplett, dann kann man auch eher sagen wo dein unerwartetes Event herkommt.

Vielleicht noch ne andere Frage die mich einfach interessiert: Wieso verwendest du hier nen Canvas?

Baka wa shinanakya naoranai.

Mein XING Profil.