簡體   English   中英

在WPF樣式中使用自定義屬性

[英]Using custom properties in WPF styles

我有這個文本框:

<TextBox/>

我想在上面加一個水印,說, Enter your message here...

由於不支持現成的功能,因此可以成功完成此操作:

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

但是,是否有一種方法可以為WatermarkText擴展具有XAML屬性的TextBox ,如下所示,讓我的樣式選擇它並使用它,或者是否有其他方法(C#等)來實現?

<TextBox WatermarkText="Enter your message here..."/>

最好的方法是使用可以以樣式綁定的附加依賴項屬性。 請記住,綁定附加的依賴項屬性是

Text={Binding (AttachedPropertyName)}

()做個把戲。

看看Mahapps。 這是一個很好的設計框架,並提供了一個TextBoxHelper類來完成所有這些工作。 它是開源的,因此您可以查看如何使用附加屬性實現它。

做我需要的最簡單的方法是將標簽放置在與文本框相同的位置,而不在.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" />

.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;
}

這也適用於密封的密碼箱, 因此,如果您嘗試擴展密封的控件,則無論如何都不能繼承它們

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM