Bei dem Versuch, die Farbe der PlaceholderText in einem Text zu binden, habe ich gewählt, um die Vorlage in einen Stil zu versuchen, platzieren wir ändern können:UWP Bindung des TextBox PlaceholderTextContentPresenter Vordergrunds auf eine Eigenschaft in dem viewmdoel Usercontrol
<Style x:Key="TextBoxStyle" TargetType="TextBox">
<Setter Property="Template">
...
<ContentPresenter x:Name="PlaceholderTextContentPresenter" Foreground="{Binding HintTextColor}" />
Mein Usercontrol:
<UserControl x:Name="This"
<TextBox
Style="{StaticResource TextBoxStyle}"
x:Name="_textBox"
/>
/>
ich habe versucht, Variationen:
Foreground="{Binding DataContext.HintTextColor, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}}"
Auch versucht (keine verbindlichen Fehler)
<ContentPresenter x:Name="PlaceholderTextContentPresenter" Foreground="{Binding ElementName=This.DataContext.HintTextColor}" />
Der Versuch, den Vordergrund auf die richtige Datacontext und Farbeigenschaften zu verbinden, aber entweder die Syntax nur in WPF unterstützt wird oder ich bekomme eine Bindung Fehler in der Ausgabe. Wie binde ich den Vordergrund an das Steuerelement Ansichtsmodell HintTextColor?
bearbeiten
Die endgültige Lösung, wie dies für mich aussieht:
<UserControl
<customControlsUwp:CustomTextBox
PlaceholderForeground="{Binding HintTextColor, Converter={StaticResource StringColorToBrushConverter}}"
/>
/>
public sealed class CustomTextBox : TextBox {
public CustomTextBox() {
DefaultStyleKey = typeof(CustomTextBox);
}
private ContentPresenter _placeholderTextContentPresenter;
public SolidColorBrush PlaceholderForeground {
get => (SolidColorBrush)GetValue(PlaceholderForegroundProperty);
set => SetValue(PlaceholderForegroundProperty, value);
}
//Add DP PlaceholderForeground for runtime bound changes to HintTextColor
public static readonly DependencyProperty PlaceholderForegroundProperty =
DependencyProperty.Register("PlaceholderForeground", typeof(SolidColorBrush), typeof(CustomTextBox), new PropertyMetadata(null, PropertyChangedCallback));
public static void PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) {
if (!(d is CustomTextBox customTextBox) || !(e.NewValue is SolidColorBrush solidColorBrush))
return;
if (customTextBox._placeholderTextContentPresenter == null)
customTextBox._placeholderTextContentPresenter.Foreground = solidColorBrush;
}
protected override void OnApplyTemplate() {
base.OnApplyTemplate();
_placeholderTextContentPresenter = GetTemplateChild("PlaceholderTextContentPresenter") as ContentPresenter;
}
}
und hat eine Vorlage in der Steuer Stil Bindung des ersten Wertesatz zu erfassen:
<ContentPresenter x:Name="PlaceholderTextContentPresenter" Foreground="{TemplateBinding PlaceholderForeground}" Grid.ColumnSpan="2" Content="{TemplateBinding PlaceholderText}" IsHitTestVisible="False" Margin="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" Grid.Row="1" TextWrapping="{TemplateBinding TextWrapping}"/>
ich diesen Code in eine neue Klassenbibliotheksprojekt für benutzerdefinierte Steuerelemente platziert haben. Ich kann das neue Steuerelement von meinem Hauptprojekt referenzieren - PropertyChangedCallback wird aufgerufen, aber die OnApplyTemplate-Überschreibung wird nie aufgerufen und der _PlaceholderTextContentPresenter ist immer null – jchristof
Clean Build scheint das behoben zu haben - ich musste auch eine Template-Bindung im Foreground hinzufügen ContentPresenter für den PlaceholderText, um den Anfangswert von der VM zu erfassen - Ich werde meinen Beitrag mit dieser Information aktualisieren. Danke vielmals! – jchristof