उदाहरण के लिए, फेसबुक में टेक्स्ट बॉक्स के खाली होने पर सर्च टेक्स्ट बॉक्स में "सर्च" हिंट टेक्स्ट होता है।
WPF टेक्स्ट बॉक्स के साथ इसे कैसे प्राप्त करें ??
उदाहरण के लिए, फेसबुक में टेक्स्ट बॉक्स के खाली होने पर सर्च टेक्स्ट बॉक्स में "सर्च" हिंट टेक्स्ट होता है।
WPF टेक्स्ट बॉक्स के साथ इसे कैसे प्राप्त करें ??
जवाबों:
आप इसे बहुत आसानी से पूरा कर सकते हैं VisualBrush
और एक में कुछ ट्रिगर के साथ 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>
इसकी पुन: प्रयोज्य को बढ़ाने के लिए Style
, आप वास्तविक क्यू बैनर पाठ, रंग, अभिविन्यास आदि को नियंत्रित करने के लिए संलग्न गुणों का एक सेट भी बना सकते हैं।
यह मेरा सरल समाधान है, जिसे 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"
क्या सामग्री का उपयोग करने के बारे में HintAssist? मैं इस का उपयोग कर रहा हूँ जो आप अस्थायी संकेत भी जोड़ सकते हैं:
<TextBox Width="150" Height="40" Text="hello" materialDesign:HintAssist.Hint="address" materialDesign:HintAssist.IsFloating="True"></TextBox>
मैंने Nuget पैकेज के साथ मटेरियल डिज़ाइन स्थापित किया है जो डॉक्यूमेंटेशन लिंक में इंस्टॉलेशन गाइड है
शुरू में ग्रे और ध्यान केंद्रित करने और खोने के लिए इवेंट हैंडलर को जोड़ने के लिए पाठ का रंग सेट करके कोड-बैक में करें।
TextBox tb = new TextBox();
tb.Foreground = Brushes.Gray;
tb.Text = "Text";
tb.GotKeyboardFocus += new KeyboardFocusChangedEventHandler(tb_GotKeyboardFocus);
tb.LostKeyboardFocus += new KeyboardFocusChangedEventHandler(tb_LostKeyboardFocus);
तब घटना संचालकों:
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";
}
}
}
आपको टेक्स्टबॉक्स को इनहेरिट करके एक कस्टम कंट्रोल बनाना होगा। नीचे दिए गए लिंक में खोज टेक्स्टबॉक्स नमूने के बारे में एक उत्कृष्ट उदाहरण है। कृपया इस पर एक नज़र डालें
http://davidowens.wordpress.com/2009/02/18/wpf-search-text-box/
आप बहुत ही सरल तरीके से कर सकते हैं। विचार यह है कि लेबल को उसी स्थान पर रखें जहां आपका टेक्स्टबॉक्स है। यदि टेक्स्टबॉक्स में कोई टेक्स्ट नहीं है और फोकस नहीं है तो आपका लेबल दिखाई देगा।
<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" />
बोनस: यदि आप अपने टेक्स्टबॉक्स के लिए डिफ़ॉल्ट मान चाहते हैं, तो डेटा सबमिट करते समय इसे सेट करने के बाद सुनिश्चित करें (उदाहरण के लिए: "InputText" = "प्लेसहोल्डर टेक्स्ट यहां" यदि खाली है)।
एक और दृष्टिकोण ;-)
यह भी साथ काम करता है PasswordBox
। यदि आप इसके साथ उपयोग करना चाहते हैं TextBox
, तो बस के PasswordChanged
साथ विनिमय करें 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>
कोड के पीछे:
private void txtPassword_PasswordChanged(object sender, RoutedEventArgs e)
{
txtHintPassword.Visibility = Visibility.Visible;
if (txtPassword.Password.Length > 0)
{
txtHintPassword.Visibility = Visibility.Hidden;
}
}
मैं एक बार उसी स्थिति में आ गया, मैंने इसे निम्नलिखित तरीके से हल किया। मैंने केवल एक हिंट बॉक्स की आवश्यकताओं को पूरा किया है, आप इसे अन्य घटनाओं जैसे कि फोकस आदि पर प्रभाव और अन्य चीजों को जोड़कर अधिक इंटरैक्टिव बना सकते हैं।
WPF कोड (मैंने इसे पठनीय बनाने के लिए स्टाइल हटा दिया है)
<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>
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;
}
}
एक अन्य उपाय MahApps.Metro जैसे WPF टूलकिट का उपयोग करना है। इसमें कई अच्छी विशेषताएं हैं, जैसे टेक्स्ट बॉक्स वॉटरमार्क:
Controls:TextBoxHelper.Watermark="Search..."
मैंने फ़ोकस इवेंट्स को प्राप्त और खो दिया:
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
यह अच्छी तरह से काम करता है, लेकिन पाठ अभी भी ग्रे में है। सफाई की जरूरत है। मैं 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>
यही मेरा लेना है:
<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>
शीर्ष सहित अधिकांश अन्य जवाबों में मेरी राय में खामियां हैं।
यह समाधान सभी परिस्थितियों में काम करता है। शुद्ध XAML, आसानी से पुन: प्रयोज्य।
मैं इसे VisualBrush
एक Style
सुझाव के साथ और कुछ ट्रिगर के साथ पूरा करता हूं 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: एप्लिकेशन रनिंग, bt डिज़ाइन लोड नहीं हो रहा है ... निम्न त्रुटि आती है: अस्पष्ट प्रकार का संदर्भ। 'StaticExtension' नाम का एक प्रकार कम से कम दो नामस्थानों में होता है, 'MS.Internal.Metadata.ExposedTypes.Xaml' और 'System.Windows.Markup'। असेंबली XmlnsDefinition विशेषताएँ समायोजित करने पर विचार करें। .net का उपयोग करते हुए। 3.5
<Trigger Property="Text" Value="{x:Static sys:String.Empty}">
<Trigger Property="Text" Value="">
WPF के लिए, कोई रास्ता नहीं है। आपको इसकी नकल करनी होगी। इस उदाहरण को देखें । एक माध्यमिक (परतदार समाधान) एक WinForms उपयोगकर्ता नियंत्रण को होस्ट करने के लिए है जो TextBox से विरासत में मिला है और EM_SETCUEBANNER संदेश को संपादन नियंत्रण में भेज रहा है। अर्थात।
[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);
}
इसके अलावा, यदि आप एक WinForm नियंत्रण दृष्टिकोण की मेजबानी करना चाहते हैं, तो मेरे पास एक ढांचा है जिसमें पहले से ही BitFlex फ्रेमवर्क नामक यह कार्यान्वयन शामिल है, जिसे आप यहां मुफ्त में डाउनलोड कर सकते हैं ।
यदि आप अधिक जानकारी चाहते हैं तो यहाँ BitFlex के बारे में एक लेख है । आपको लगता है कि अगर आप विंडोज एक्सप्लोरर शैली नियंत्रण देख रहे हैं कि यह आम तौर पर बॉक्स से बाहर कभी नहीं आता है, और क्योंकि WPF हैंडल के साथ काम नहीं करता है आम तौर पर आप Win32 या आप की तरह एक मौजूदा नियंत्रण के आसपास एक आसान आवरण नहीं लिख सकते हैं WinForms के साथ।
स्क्रीनशॉट: