PasswordBox Hint Text | Watermark | Placeholder

  • WPF

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von SuprexAV.

    PasswordBox Hint Text | Watermark | Placeholder

    Guten Tag

    Nun versuche ich seit mehreren Tagen eine PasswordBox mit einem Text (Hint Text | Watermark | Placeholder) zu versehen der beim Klicken auf die PasswordBox verschwindet, ein Bild von dem ganzen seht ihr unten. Die einzige, ich nenne es mal "Lösung", die ich wüsste, wäre anstatt einer PasswordBox eine Textbox zu verwenden, was aber nicht mein Ziel ist. Da ich bereits diverse Foren und gefühlt 100 Googleseiten durchgesucht habe, wäre es nett wenn es mir jemand erklären könnte, bzw. einen Quellcode für mein Problem zeigen könnt, aus dem ich lernen könnte wie es funktioniert.

    VB.NET-Quellcode

    1. <PasswordBox Width="250" Height="40" Margin="25, 0, 25, 25" Foreground="Black" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="20" Padding="10,5,10,5">
    2. <PasswordBox.Resources>
    3. <Style TargetType="{x:Type PasswordBox}">
    4. <Setter Property="Background" Value="White"/>
    5. <Setter Property="Template">
    6. <Setter.Value>
    7. <ControlTemplate TargetType="{x:Type PasswordBox}">
    8. <Border Background="White" BorderBrush="#FFABADB3" BorderThickness="1" CornerRadius="0,0,3,3">
    9. <ScrollViewer x:Name="PART_ContentHost" Focusable="false" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"/>
    10. </Border>
    11. </ControlTemplate>
    12. </Setter.Value>
    13. </Setter>
    14. </Style>
    15. </PasswordBox.Resources>
    16. </PasswordBox>
    Bilder
    • PasswordBox.PNG

      126,51 kB, 1.454×844, 100 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „SuprexAV“ ()

    Ich bin selber noch nicht in der WPF tief genug drin, aber Antwort#2 auf stackoverflow klingt doch ganz sinnvoll …
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo

    Der vernünftigste Weg ist der den @VaporiZed bereits erwähnt hat da dieser auch Binding und MVVM fähig ist. Genau für solche Dinge gibt es ja AttachedProperties. Da nämlich bei der PasswordBox das Property "Password" aus Sicherheitsgründen NICHT als DependencyProperty implementiert wurde muss man hier eben eigene Wege gehen.

    Ich fasse das Beispiel von StackOverflow hier mal kurz zusammen damit wir das hier auch haben.

    Du erstellst dir eine neue Klasse innerhalb deines View-Namespaces und nennst diese mal ​PasswordBoxMonitor welche von DependencyObject erben muss. Wie AttachedProperties funktionieren und wie man damit eigenes Bastelt habe ich in einem eigenen Kapitel in meiner Tutorialreihe besprochen.

    So sieht das dann aus:

    VB.NET-Quellcode

    1. [b][/b]Public Class PasswordBoxMonitor
    2. Inherits DependencyObject
    3. Public Shared Function GetIsMonitoring(ByVal obj As DependencyObject) As Boolean
    4. Return CBool(obj.GetValue(IsMonitoringProperty))
    5. End Function
    6. Public Shared Sub SetIsMonitoring(ByVal obj As DependencyObject, ByVal value As Boolean)
    7. obj.SetValue(IsMonitoringProperty, value)
    8. End Sub
    9. Public Shared ReadOnly IsMonitoringProperty As DependencyProperty = DependencyProperty.RegisterAttached("IsMonitoring", GetType(Boolean), GetType(PasswordBoxMonitor), New UIPropertyMetadata(False, AddressOf OnIsMonitoringChanged))
    10. Public Shared Function GetPasswordLength(ByVal obj As DependencyObject) As Integer
    11. Return CInt(obj.GetValue(PasswordLengthProperty))
    12. End Function
    13. Public Shared Sub SetPasswordLength(ByVal obj As DependencyObject, ByVal value As Integer)
    14. obj.SetValue(PasswordLengthProperty, value)
    15. End Sub
    16. Public Shared ReadOnly PasswordLengthProperty As DependencyProperty = DependencyProperty.RegisterAttached("PasswordLength", GetType(Integer), GetType(PasswordBoxMonitor), New UIPropertyMetadata(0))
    17. Private Shared Sub OnIsMonitoringChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
    18. Dim pb = TryCast(d, PasswordBox)
    19. If pb Is Nothing Then
    20. Return
    21. End If
    22. If CBool(e.NewValue) Then
    23. AddHandler pb.PasswordChanged, AddressOf PasswordChanged
    24. Else
    25. RemoveHandler pb.PasswordChanged, AddressOf PasswordChanged
    26. End If
    27. End Sub
    28. Private Shared Sub PasswordChanged(ByVal sender As Object, ByVal e As RoutedEventArgs)
    29. Dim pb = TryCast(sender, PasswordBox)
    30. If pb Is Nothing Then
    31. Return
    32. End If
    33. SetPasswordLength(pb, pb.Password.Length)
    34. End Sub
    35. End Class


    Dann erstellst du einen Style in deinen Resourcen für die Passwortbox um das aussehen zu bestimmen:

    XML-Quellcode

    1. <Style x:Key="{x:Type PasswordBox}"
    2. TargetType="{x:Type PasswordBox}">
    3. <Setter Property="WpfTest:PasswordBoxMonitor.IsMonitoring"
    4. Value="True"/>
    5. <Setter Property="Template">
    6. <Setter.Value>
    7. <ControlTemplate TargetType="{x:Type PasswordBox}">
    8. <Border Name="Bd"
    9. Background="{TemplateBinding Background}"
    10. BorderThickness="{TemplateBinding BorderThickness}"
    11. BorderBrush="{TemplateBinding BorderBrush}"
    12. SnapsToDevicePixels="true">
    13. <Grid>
    14. <ScrollViewer x:Name="PART_ContentHost"
    15. SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
    16. <TextBlock Text="Passwort eingeben"
    17. Margin="4, 2, 0, 0"
    18. Foreground="Gray"
    19. Visibility="Collapsed"
    20. Name="txtPrompt" />
    21. </Grid>
    22. </Border>
    23. <ControlTemplate.Triggers>
    24. <Trigger Property="IsEnabled"
    25. Value="false">
    26. <Setter TargetName="Bd"
    27. Property="Background"
    28. Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
    29. <Setter Property="Foreground"
    30. Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
    31. </Trigger>
    32. <Trigger Property="WpfTest:PasswordBoxMonitor.PasswordLength" Value="0">
    33. <Setter Property="Visibility" TargetName="txtPrompt" Value="Visible"/>
    34. </Trigger>
    35. </ControlTemplate.Triggers>
    36. </ControlTemplate>
    37. </Setter.Value>
    38. </Setter>
    39. </Style>


    Das View: im XAML ist der Namespace in welchem die Klasse ​PasswordBoxMonitor liegt.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##