私はCustomControls
というタイトルの新しいWPFプロジェクトで次のことをしました。カスタムWPFテキストボックスコントロールでこのウォーターマークが表示されないのはなぜですか?
ステップ1:Controls
フォルダを作成しました。 WatermarkTextBox.cs
という名前の新しいファイルを追加しました。このC#のコードは、ファイルに追加されました:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
namespace Controls
{
public class WatermarkTextBox : TextBox
{
public static readonly DependencyProperty WatermarkProperty = DependencyProperty.Register("Watermark", typeof(String), typeof(WatermarkTextBox), new PropertyMetadata(String.Empty));
public String Watermark
{
get { return (String)GetValue(WatermarkProperty); }
set { SetValue(WatermarkProperty, value); }
}
}
}
ステップ2:Controls
フォルダ内で、WatermarkTextBox.xaml
題した新しいファイルを追加しました。ファイルにこのXAMLを追加しました:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:controls="clr-namespace:Controls">
<Style TargetType="{x:Type controls:WatermarkTextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
<Style.Resources>
<VisualBrush x:Key="WatermarkBrush" AlignmentX="Left" AlignmentY="Center" Stretch="None">
<VisualBrush.Visual>
<Label Content="{Binding Watermark}" FontFamily="Segoe UI" FontSize="20" Foreground="LightGray" Padding="5" />
</VisualBrush.Visual>
</VisualBrush>
</Style.Resources>
<Style.Triggers>
<Trigger Property="Text" Value="{x:Static sys:String.Empty}">
<Setter Property="Background" Value="{StaticResource WatermarkBrush}" />
</Trigger>
<Trigger Property="Text" Value="{x:Null}">
<Setter Property="Background" Value="{StaticResource WatermarkBrush}" />
</Trigger>
<Trigger Property="IsKeyboardFocused" Value="True">
<Setter Property="Background" Value="White" />
</Trigger>
</Style.Triggers>
</Style>
</ResourceDictionary>
ステップ3:Themes
フォルダを作成します。 Generic.xaml
という名前の新しいファイルを追加します。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/CustomControls;component/Controls/WatermarkTextBox.xaml" />
</ResourceDictionary.MergedDictionaries>
ステップ4:MainWindow.xaml
で:ファイルにこのXAMLを追加xmlns:controls="clr-namespace:Controls"
追加されましたが、新しいWatermarkTextBox
定義:
<controls:WatermarkTextBox x:Name="Hostname" Height="40" FontFamily="Segoe UI" FontSize="20" VerticalContentAlignment="Center" Watermark="Hello, world."/>
私はこのカスタムというテキストボックスを参照してくださいコントロールは基づいていますが、私はそれを拡張したウォーターマークを見ません。それはなぜですか、私はどのように透かしを表示できますか? P.S. XAMLの{Binding Watermark}
をハードコードされた文字列に変更すると、ウォーターマークが表示されることに注意してください。また、コードをデバッグすると、WatermarkTextBox
が正しい値を取得することがわかります...なぜ、XAMLがそれを表示しないのですか?誰かがこのようなものをどうデバッグすることができますか?
ここで私の答えをチェックしてください。http://stackoverflow.com/questions/37995806/textpreview-for-textbox/37997102#37997102 –