2016-06-21 13 views
0

Ich habe dieses Textfeld:Verwenden von benutzerdefinierten Eigenschaften in WPF Arten

<TextBox/> 

Ich möchte ein Wasserzeichen, um es hinzuzufügen zu sagen, Enter your message here...

Seit dem nicht aus der Box unterstützt, dies erfolgreich tut der Trick:

<Style TargetType="TextBox" xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
    <Style.Resources> 
     <VisualBrush x:Key="CueBannerBrush" AlignmentX="Left" AlignmentY="Center" Stretch="None"> 
      <VisualBrush.Visual> 
       <Label Content="Enter your message here..." Foreground="LightGray" Padding="10 0 0 0" /> 
      </VisualBrush.Visual> 
     </VisualBrush> 
    </Style.Resources> 
    <Style.Triggers> 
     <Trigger Property="Text" Value="{x:Static sys:String.Empty}"> 
      <Setter Property="Background" Value="{StaticResource CueBannerBrush}" /> 
     </Trigger> 
     <Trigger Property="Text" Value="{x:Null}"> 
      <Setter Property="Background" Value="{StaticResource CueBannerBrush}" /> 
     </Trigger> 
     <Trigger Property="IsKeyboardFocused" Value="True"> 
      <Setter Property="Background" Value="White" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

Aber ist es eine Möglichkeit, TextBox mit einer XAML Eigenschaft für WatermarkText zu verlängern, wie folgt und habe es meinen Stil wählen und benutze es oder gibt es einen anderen Weg (C#, etc.)?

+0

Wenn Sie Ihren aktuellen Ansatz verwenden möchten, und nur eine Eigenschaft haben, in der Zeichenfolge mit. Ersetzen Sie einfach "Geben Sie hier Ihre Nachricht ein ..." mit "{TemplateBinding Tag}" und benutzen Sie die 'Tag'-Eigenschaft, so dass es'

+0

@ChrisW. Das sollte gut funktionieren, aber ich würde mein XAML-Element nicht mehr erweitern können, sobald ich mein 'Tag' aufgebraucht habe. Es muss einen besseren Weg geben ... – Alexandru

+0

Die Leute haben es eine Reihe von verschiedenen Möglichkeiten, die Sie mit einer schnellen Google-Suche finden können. Persönlich letztes Mal musste ich eine benutzerdefinierte Vorlage mit einem hinzugefügten TextBlock erstellen, der an Tag gebunden ist, das bei Focus die Sichtbarkeit reduzierte, und wenn der Texteigenschaftswert = {x: Null} false (mit Datentrigger) war, wurde auch die Sichtbarkeit reduziert. Ich habe nicht lange gebraucht, an was ich mich erinnere. Wie 10 Minuten. –

Antwort

1

Der beste Weg, dies zu tun, ist Attached Dependency Properties, die Sie im Stil binden können. Denken Sie daran, dass das Binden einer angefügten Abhängigkeitseigenschaft

The() den Trick macht.

Werfen Sie einen Blick auf Mahapps. Es ist ein schönes Design-Framework und bietet eine TextBoxHelper-Klasse, die all dies tut. Es ist Open Source, so dass Sie sehen können, wie es mit angehängten Eigenschaften implementiert wird.

0

Der einfachste Weg zu tun, was ich brauche, ist nur ohne Treffertest Sichtbarkeit ein Etikett in der gleichen Position wie das Textfeld setzen in der .xaml:

<TextBox Name="Username" Grid.Row="2" Height="40" FontFamily="Segoe UI" FontSize="20" VerticalContentAlignment="Center" TextChanged="Username_TextChanged"/> 
<Label Name="UsernameLabel" Content="Username" Grid.Row="2" FontFamily="Segoe UI" FontSize="20" Foreground="LightGray" Padding="5" IsHitTestVisible="False" /> 

Im .cs:

private void Hostname_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    UpdateLabel(Hostname, HostnameLabel); 
} 

private void UpdateLabel(TextBox textBox, Label label) 
{ 
    label.Visibility = String.IsNullOrWhiteSpace(textBox.Text) ? Visibility.Visible : Visibility.Hidden; 
} 

Dies funktioniert auch für Passwort-Boxen, die versiegelt sind, so you cannot inherit them anyways if you tried to extend sealed controls.

Verwandte Themen