Misalnya, Facebook memiliki teks petunjuk "Pencarian" di kotak teks Pencarian saat kotak teks kosong.
Bagaimana cara mencapai ini dengan kotak teks WPF ??
Misalnya, Facebook memiliki teks petunjuk "Pencarian" di kotak teks Pencarian saat kotak teks kosong.
Bagaimana cara mencapai ini dengan kotak teks WPF ??
Jawaban:
Anda dapat melakukannya dengan lebih mudah dengan a VisualBrush
dan beberapa pemicu di Style
:
<TextBox>
<TextBox.Style>
<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="Search" Foreground="LightGray" />
</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>
</TextBox.Style>
</TextBox>
Untuk meningkatkan kegunaan kembali ini Style
, Anda juga dapat membuat satu set properti terlampir untuk mengontrol teks spanduk isyarat sebenarnya, warna, orientasi dll.
Ini adalah solusi sederhana saya, diadaptasi dari Microsoft ( https://code.msdn.microsoft.com/windowsapps/How-to-add-a-hint-text-to-ed66a3c6 )
<Grid Background="White" HorizontalAlignment="Right" VerticalAlignment="Top" >
<!-- overlay with hint text -->
<TextBlock Margin="5,2" MinWidth="50" Text="Suche..."
Foreground="LightSteelBlue" Visibility="{Binding ElementName=txtSearchBox, Path=Text.IsEmpty, Converter={StaticResource MyBoolToVisibilityConverter}}" />
<!-- enter term here -->
<TextBox MinWidth="50" Name="txtSearchBox" Background="Transparent" />
</Grid>
IsHitTestVisible="False"
bagaimana dengan menggunakan materialDesign HintAssist? Saya menggunakan ini yang juga Anda dapat menambahkan petunjuk mengambang juga:
<TextBox Width="150" Height="40" Text="hello" materialDesign:HintAssist.Hint="address" materialDesign:HintAssist.IsFloating="True"></TextBox>
Saya menginstal Desain Material dengan Paket Nuget ada panduan instalasi di tautan dokumentasi
Lakukan di belakang kode dengan menyetel warna teks awalnya menjadi abu-abu dan menambahkan penangan acara untuk mendapatkan dan kehilangan fokus keyboard.
TextBox tb = new TextBox();
tb.Foreground = Brushes.Gray;
tb.Text = "Text";
tb.GotKeyboardFocus += new KeyboardFocusChangedEventHandler(tb_GotKeyboardFocus);
tb.LostKeyboardFocus += new KeyboardFocusChangedEventHandler(tb_LostKeyboardFocus);
Kemudian penangan acara:
private void tb_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
if(sender is TextBox)
{
//If nothing has been entered yet.
if(((TextBox)sender).Foreground == Brushes.Gray)
{
((TextBox)sender).Text = "";
((TextBox)sender).Foreground = Brushes.Black;
}
}
}
private void tb_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
//Make sure sender is the correct Control.
if(sender is TextBox)
{
//If nothing was entered, reset default text.
if(((TextBox)sender).Text.Trim().Equals(""))
{
((TextBox)sender).Foreground = Brushes.Gray;
((TextBox)sender).Text = "Text";
}
}
}
Anda harus membuat kontrol khusus dengan mewarisi kotak teks. Tautan di bawah ini memiliki contoh yang sangat baik tentang sampel kotak teks pencarian. Tolong lihat ini
http://davidowens.wordpress.com/2009/02/18/wpf-search-text-box/
Anda dapat melakukannya dengan cara yang sangat sederhana. Idenya adalah untuk menempatkan Label di tempat yang sama dengan kotak teks Anda. Label Anda akan terlihat jika kotak teks tidak memiliki teks dan tidak memiliki fokus.
<Label Name="PalceHolder" HorizontalAlignment="Left" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Height="40" VerticalAlignment="Top" Width="239" FontStyle="Italic" Foreground="BurlyWood">PlaceHolder Text Here
<Label.Style>
<Style TargetType="{x:Type Label}">
<Setter Property="Visibility" Value="Hidden"/>
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding ="{Binding ElementName=PalceHolder, Path=Text.Length}" Value="0"/>
<Condition Binding ="{Binding ElementName=PalceHolder, Path=IsFocused}" Value="False"/>
</MultiDataTrigger.Conditions>
<Setter Property="Visibility" Value="Visible"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Label.Style>
</Label>
<TextBox Background="Transparent" Name="TextBox1" HorizontalAlignment="Left" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Height="40"TextWrapping="Wrap" Text="{Binding InputText,Mode=TwoWay}" VerticalAlignment="Top" Width="239" />
Bonus: Jika Anda ingin memiliki nilai default untuk textBox Anda, pastikan setelah mengaturnya saat mengirimkan data (misalnya: "InputText" = "PlaceHolder Text Here" jika kosong).
Pendekatan lain ;-)
ini juga bekerja dengan PasswordBox
. Jika ingin menggunakannya dengan TextBox
, cukup tukar PasswordChanged
dengan TextChanged
.
XAML:
<Grid>
<!-- overlay with hint text -->
<TextBlock Margin="5,2"
Text="Password"
Foreground="Gray"
Name="txtHintPassword"/>
<!-- enter user here -->
<PasswordBox Name="txtPassword"
Background="Transparent"
PasswordChanged="txtPassword_PasswordChanged"/>
</Grid>
CodeBehind:
private void txtPassword_PasswordChanged(object sender, RoutedEventArgs e)
{
txtHintPassword.Visibility = Visibility.Visible;
if (txtPassword.Password.Length > 0)
{
txtHintPassword.Visibility = Visibility.Hidden;
}
}
Saya pernah mengalami situasi yang sama, saya menyelesaikannya dengan cara berikut. Saya hanya memenuhi persyaratan kotak petunjuk, Anda dapat membuatnya lebih interaktif dengan menambahkan efek dan hal-hal lain pada acara lain seperti fokus, dll.
KODE WPF (Saya telah menghapus gaya agar dapat dibaca)
<Grid Margin="0,0,0,0" Background="White">
<Label Name="adminEmailHint" Foreground="LightGray" Padding="6" FontSize="14">Admin Email</Label>
<TextBox Padding="4,7,4,8" Background="Transparent" TextChanged="adminEmail_TextChanged" Height="31" x:Name="adminEmail" Width="180" />
</Grid>
<Grid Margin="10,0,10,0" Background="White" >
<Label Name="adminPasswordHint" Foreground="LightGray" Padding="6" FontSize="14">Admin Password</Label>
<PasswordBox Padding="4,6,4,8" Background="Transparent" PasswordChanged="adminPassword_PasswordChanged" Height="31" x:Name="adminPassword" VerticalContentAlignment="Center" VerticalAlignment="Center" Width="180" FontFamily="Helvetica" FontWeight="Light" FontSize="14" Controls:TextBoxHelper.Watermark="Admin Password" FontStyle="Normal" />
</Grid>
Kode C #
private void adminEmail_TextChanged(object sender, TextChangedEventArgs e)
{
if(adminEmail.Text.Length == 0)
{
adminEmailHint.Visibility = Visibility.Visible;
}
else
{
adminEmailHint.Visibility = Visibility.Hidden;
}
}
private void adminPassword_PasswordChanged(object sender, RoutedEventArgs e)
{
if (adminPassword.Password.Length == 0)
{
adminPasswordHint.Visibility = Visibility.Visible;
}
else
{
adminPasswordHint.Visibility = Visibility.Hidden;
}
}
Solusi lain adalah dengan menggunakan toolkit WPF seperti MahApps.Metro. Ini memiliki banyak fitur bagus, seperti tanda air kotak teks:
Controls:TextBoxHelper.Watermark="Search..."
Saya menggunakan acara fokus yang didapat dan hilang:
Private Sub txtSearchBox_GotFocus(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles txtSearchBox.GotFocus
If txtSearchBox.Text = "Search" Then
txtSearchBox.Text = ""
Else
End If
End Sub
Private Sub txtSearchBox_LostFocus(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles txtSearchBox.LostFocus
If txtSearchBox.Text = "" Then
txtSearchBox.Text = "Search"
Else
End If
End Sub
Ini berfungsi dengan baik, tetapi teksnya masih berwarna abu-abu. Perlu dibersihkan. Saya menggunakan VB.NET
<Grid>
<TextBox Name="myTextBox"/>
<TextBlock>
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=myTextBox, Path=Text.IsEmpty}" Value="True">
<Setter Property="Text" Value="Prompt..."/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>
Itu pendapat saya:
<ControlTemplate>
<Grid>
<Grid.Resources>
<!--Define look / layout for both TextBoxes here. I applied custom Padding and BorderThickness for my application-->
<Style TargetType="TextBox">
<Setter Property="Padding" Value="4"/>
<Setter Property="BorderThickness" Value="2"/>
</Style>
</Grid.Resources>
<TextBox x:Name="TbSearch"/>
<TextBox x:Name="TbHint" Text="Suche" Foreground="LightGray"
Visibility="Hidden" IsHitTestVisible="False" Focusable="False"/>
</Grid>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition SourceName="TbSearch" Property="Text" Value="{x:Static sys:String.Empty}"/>
<Condition SourceName="TbSearch" Property="IsKeyboardFocused" Value="False"/>
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter TargetName="TbHint" Property="Visibility" Value="Visible"/>
</MultiTrigger.Setters>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition SourceName="TbSearch" Property="Text" Value="{x:Null}"/>
<Condition SourceName="TbSearch" Property="IsKeyboardFocused" Value="False"/>
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter TargetName="TbHint" Property="Visibility" Value="Visible"/>
</MultiTrigger.Setters>
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
Kebanyakan jawaban lain termasuk yang teratas memiliki kekurangan menurut saya.
Solusi ini berfungsi dalam semua keadaan. XAML murni, mudah digunakan kembali.
Saya melakukannya dengan VisualBrush
dan beberapa pemicu dalam Style
disarankan oleh: sellmeadog
.
<TextBox>
<TextBox.Style>
<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="Search" Foreground="LightGray" />
</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>
</TextBox.Style>
</TextBox>
@sellmeadog: Aplikasi berjalan, bt Desain tidak memuat ... Kesalahan berikut muncul: Referensi jenis ambigu. Jenis bernama 'StaticExtension' muncul di setidaknya dua ruang nama, 'MS.Internal.Metadata.ExposedTypes.Xaml' dan 'System.Windows.Markup'. Pertimbangkan untuk menyesuaikan atribut XmlnsDefinition assembly. sedang menggunakan .net 3.5
<Trigger Property="Text" Value="{x:Static sys:String.Empty}">
ke<Trigger Property="Text" Value="">
Untuk WPF, tidak ada cara. Anda harus menirunya. Lihat contoh ini . Sekunder (solusi tidak stabil) adalah menjadi tuan rumah kontrol pengguna WinForms yang mewarisi dari TextBox dan mengirim pesan EM_SETCUEBANNER ke kontrol edit. yaitu.
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam);
private const Int32 ECM_FIRST = 0x1500;
private const Int32 EM_SETCUEBANNER = ECM_FIRST + 1;
private void SetCueText(IntPtr handle, string cueText) {
SendMessage(handle, EM_SETCUEBANNER, IntPtr.Zero, Marshal.StringToBSTR(cueText));
}
public string CueText {
get {
return m_CueText;
}
set {
m_CueText = value;
SetCueText(this.Handle, m_CueText);
}
Juga, jika Anda ingin menjadi tuan rumah pendekatan kontrol WinForm, saya memiliki kerangka kerja yang sudah menyertakan implementasi ini yang disebut Kerangka Kerja BitFlex, yang dapat Anda unduh secara gratis di sini .
Berikut adalah artikel tentang BitFlex jika Anda menginginkan informasi lebih lanjut. Anda akan mulai menemukan bahwa jika Anda ingin memiliki kontrol gaya Windows Explorer yang umumnya tidak pernah keluar dari kotak, dan karena WPF tidak bekerja dengan pegangan umumnya Anda tidak dapat menulis pembungkus mudah di sekitar Win32 atau kontrol yang ada seperti Anda bisa dengan WinForms.
Tangkapan layar: