পাঠ্যবক্সে স্থানধারক পাঠ্য যুক্ত করা হচ্ছে


147

আমি এইচটিএমএল 5 তে একটি পাঠ্যবক্সের সাহায্যে পাঠ্যধারীর পাঠ্য সংযোজন করার উপায় খুঁজছি।

উদাহরণস্বরূপ, যদি পাঠ্যবক্সে কোনও পাঠ্য না থাকে, তবে এটি পাঠ্য যুক্ত করে Enter some text here, যখন ব্যবহারকারী এটিতে ক্লিক করে স্থানধারক পাঠ্যটি অদৃশ্য হয়ে যায় এবং ব্যবহারকারীকে তাদের নিজস্ব পাঠ্য প্রবেশ করতে দেয় এবং যদি পাঠ্যবক্সটি ফোকাস হারিয়ে ফেলে এবং এখনও কোনও পাঠ্য না থাকে তবে স্থানধারকটি আবার পাঠ্যবাক্সে যুক্ত হয়েছে।


4
স্থানধারক পাঠ্যের জন্য পাঠ্য সম্পত্তি ব্যবহার করবেন না। এটি বাইন্ডিংয়ের সাথে হস্তক্ষেপ করবে। ব্যবহারের AdornerDecorator ( msdn.microsoft.com/en-us/library/... )
পাভেল Voronin

2
একটি সময়ে দেখে নিন stackoverflow.com/questions/833943/...
SepehrM

5
কেবলমাত্র একটি এফওয়াইআই - ওয়াটারমার্ক ওরফে ইঙ্গিত পাঠ্য ওরফে স্থানধারক পাঠ্য ওরফে কিউ ব্যানার । এই সমস্ত পদ সমার্থক উদ্দেশ্য আছে।
আরবিটি

উত্তর:


91

এটি কি ঠিক এমন কিছু হবে না:

Textbox myTxtbx = new Textbox();
myTxtbx.Text = "Enter text here...";

myTxtbx.GotFocus += GotFocus.EventHandle(RemoveText);
myTxtbx.LostFocus += LostFocus.EventHandle(AddText);

public void RemoveText(object sender, EventArgs e)
{
    if (myTxtbx.Text == "Enter text here...") 
    {
     myTxtbx.Text = "";
    }
}

public void AddText(object sender, EventArgs e)
{
    if (string.IsNullOrWhiteSpace(myTxtbx.Text))
        myTxtbx.Text = "Enter text here...";
}

এটি কেবল সিউডোকোড তবে ধারণাটি রয়েছে।


ধন্যবাদ আমি প্রত্যাশা করছিলাম সেখানে এক ধরণের এক্সএএমএল থাকবে যা স্থানধারক তৈরি করতে ব্যবহার করা যেতে পারে। আপনার সহায়তার জন্য ধন্যবাদ
বোর্ডি

1
আমি এমন একটি সমাধান খুঁজে পাওয়ার আশা করছিলাম যা ব্যবহারকারীর পাঠ্য প্রবেশ না করা পর্যন্ত পাঠ্যবক্সে স্থানধারক পাঠ্য রাখে। মনে হচ্ছে এটি আরও ভাল কাজ করবে।
ড্রবল টেবিল ব্যবহারকারীরা

6
এটি তবে কাজ করবে যদি পাঠ্যবাক্সের মান উত্সের সাথে আবদ্ধ থাকে তবে আপনার সম্ভবত সমস্যা আছে।
পাভেল ভোরোনিন

1
এটি সহজ সরল সমাধান, কেবলমাত্র এটি হ'ল পাঠ্য প্রবেশের পরেও যদি ব্যবহারকারী আবার পাঠ্যবক্সে ক্লিক করেন (যেমন, আরও পাঠ্য সংযোজন বা কিছু অক্ষর মুছতে) পুরো পাঠ্যবক্সটি
প্রবেশমূল্যটি

2
RemoveTextএবং AddTextপদ্ধতি হওয়া উচিত public void, অকার্যকর । এবং @ বিবাসওয়ানবান্দ্যপাধ্যায় যেমন বলেছেন, RemoveTextপদ্ধতিটি এটি হতে পারে:if (myTxtbx.Text == "Enter text here...") {myTxtbx.Text = "";}
কাকা

91

আপনি এটি ব্যবহার করতে পারেন, এটি আমার পক্ষে কাজ করছে এবং এটি অত্যন্ত সহজ সমাধান।

    <Style x:Key="placeHolder" TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid>
                        <TextBox Text="{Binding Path=Text,
                                                RelativeSource={RelativeSource TemplatedParent}, 
                                                Mode=TwoWay,
                                                UpdateSourceTrigger=PropertyChanged}"
                                 x:Name="textSource" 
                                 Background="Transparent" 
                                 Panel.ZIndex="2" />
                        <TextBox Text="{TemplateBinding Tag}" Background="{TemplateBinding Background}" Panel.ZIndex="1">
                            <TextBox.Style>
                                <Style TargetType="{x:Type TextBox}">
                                    <Setter Property="Foreground" Value="Transparent"/>
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding Path=Text, Source={x:Reference textSource}}" Value="">
                                            <Setter Property="Foreground" Value="LightGray"/>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </TextBox.Style>
                        </TextBox>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

ব্যবহার:

<TextBox Style="{StaticResource placeHolder}" Tag="Name of customer" Width="150" Height="24"/>

‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎


1
হাই @ ম্যাকগাইল, আমি আপনার দুর্দান্ত সমাধানটি সংশোধন করেছি, কারণ আমার মূল পাঠ্য সম্পত্তি এবং পাঠ্য উত্সের পাঠ্য উত্সের মধ্যে দ্বিপথ বাঁধাই করা দরকার।
গ্যাবার প্লেজ

1
@ রব এটি একটি সংস্থান অভিধানে রাখুন। উইন্ডো.সম্পদ, ইত্যাদি
ব্রায়ান

6
ফোকাস ইস্যুগুলির জন্য এটি যুক্ত করুন: <ControlTemplate.Triggers> <Trigger Property="IsFocused" Value="True"> <Setter Property="FocusManager.FocusedElement" TargetName="textSource" Value="{Binding RelativeSource={RelativeSource Self}}" /> </Trigger> </ControlTemplate.Triggers>
সিহান ইয়াকার

1
আমি TextWrapping="wrap"স্টাইলের টেক্সটবক্স ট্যাগ দুটিতেই টেক করব , যদি আপনি আমার মতো প্লেসহোল্ডার পাঠ্যের সাথে একটি বহু-লাইন পাঠ্যবক্স করতে চান।
jpcguy89

1
@ সাচিন আমি আমার ম্যাক্সলেংঘটি সম্পত্তি স্থির করেছি। সমস্যাটি হ'ল একটি পাঠ্যবাক্স 2 টি পাঠ্যবক্সে প্রতিস্থাপন করা হয়। একটি ইনপুট জন্য এবং একটি স্থানধারকের জন্য। ফিক্স ভাঙ্গা বৈশিষ্ট্য আপনি শুধু তাদের ভালো প্রথম পাঠ্যবাক্স যোগ করা প্রয়োজন: <TextBox Text="{Binding Path=Text, RelativeSource=RelativeSource TemplatedParent}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" x:Name="textSource" Background="Transparent" Panel.ZIndex="2" MaxLength="{TemplateBinding MaxLength}" />। আপনার ক্ষেত্রে আপনাকে সম্ভবত যুক্ত করতে হবেAcceptsReturn="{TemplateBinding AcceptsReturn}"
কলম্যানজে

47

স্থানধারক পাঠ্য সেট এবং মুছে ফোকাস প্রবেশ এবং ফোকাস ছাড়ার ইভেন্টগুলি পরিচালনা করার পরিবর্তে উইন্ডোজ সেন্ডম্যাসেজ ফাংশনটি প্রেরণে ব্যবহার করা সম্ভব EM_SETCUEBANNER আমাদের পাঠ্যবক্সে বার্তা জন্য আমাদের ।

এটি দুটি সহজ পদক্ষেপের সাহায্যে করা যেতে পারে। প্রথমে আমাদের উইন্ডোজটি প্রকাশ করতে হবেSendMessage ফাংশনটি হবে।

private const int EM_SETCUEBANNER = 0x1501;

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern Int32 SendMessage(IntPtr hWnd, int msg, int wParam, [MarshalAs(UnmanagedType.LPWStr)]string lParam);

তারপরে কেবল আমাদের পাঠ্যবক্সের হ্যান্ডেল, EM_SETCUEBANNER এর মান এবং আমরা সেট করতে চাইলে পাঠ্যটি কল করুন।

SendMessage(textBox1.Handle, EM_SETCUEBANNER, 0, "Username");
SendMessage(textBox2.Handle, EM_SETCUEBANNER, 0, "Password");

তথ্যসূত্র: পাঠ্যবক্সের জন্য স্থানধারক পাঠ্য সেট করুন (কিউ পাঠ্য)


10
দ্রষ্টব্য: এটি WPF এর জন্য কাজ করে না । দেখুন: stackoverflow.com/questions/5054872/...
ArtOfCode

এখানে সেরা উত্তর, তবে নোট করুন ফর্ম_ল্ডটি খুব তাড়াতাড়ি, আমাকে কাজ করার আগে ফর্ম_শাউন পর্যন্ত অপেক্ষা করতে হয়েছিল।
জে ক্রোগান

এটির জন্য আমি কেবলমাত্র ঘৃণা করি তা হ'ল পাঠ্যটি নিয়ন্ত্রণের সাথে সাথেই অদৃশ্য হয়ে যায়, যার অর্থ যদি আপনি এটি কী বলেছিলেন (এবং এটি গুরুত্বপূর্ণ) না ধরেন তবে আপনাকে আবার স্থানধারক পাঠ্যটি দেখতে এটির বাইরে ক্লিক করতে হবে । আমি একটি স্থানধারক যুক্ত করতে অন্য উত্তর যুক্ত করেছি যা কেবল ব্যবহারকারী টাইপ করা শুরু করার পরে অদৃশ্য হয়ে যায়।
গ্যাব্রিয়েল লুসি

19

এই শ্রেণিকে আপনার প্রকল্প যুক্ত করুন এবং আপনার সমাধানটি তৈরি করুন। ভিজ্যুয়াল স্টুডিওতে টুলবক্সে ক্লিক করুন আপনি প্লেসহোল্ডার টেক্সটবক্স নামে একটি নতুন পাঠ্যবক্স উপাদান দেখতে পাবেন। ফর্ম ডিজাইনে আপনার বর্তমান পাঠ্যবক্সটি মুছুন এবং প্লেসহোল্ডারটেক্সটবক্সের সাথে প্রতিস্থাপন করুন।

এখানে চিত্র বর্ণনা লিখুন

প্লেসহোল্ডারটেক্সটবক্সের একটি জায়গা রয়েছে প্লেসহোল্ডারটেক্সট। আপনি চান যে কোনও পাঠ্য সেট করুন এবং আপনার দিনটি শুভ হোক :)

public class PlaceHolderTextBox : TextBox
{

    bool isPlaceHolder = true;
    string _placeHolderText;
    public string PlaceHolderText
    {
        get { return _placeHolderText; }
        set
        {
            _placeHolderText = value;
            setPlaceholder();
        }
    }

    public new string Text
    {
        get => isPlaceHolder ? string.Empty : base.Text;
        set => base.Text = value;
    }

    //when the control loses focus, the placeholder is shown
    private void setPlaceholder()
    {
        if (string.IsNullOrEmpty(base.Text))
        {
            base.Text = PlaceHolderText;
            this.ForeColor = Color.Gray;
            this.Font = new Font(this.Font, FontStyle.Italic);
            isPlaceHolder = true;
        }
    }

    //when the control is focused, the placeholder is removed
    private void removePlaceHolder()
    {

        if (isPlaceHolder)
        {
            base.Text = "";
            this.ForeColor = System.Drawing.SystemColors.WindowText;
            this.Font = new Font(this.Font, FontStyle.Regular);
            isPlaceHolder = false;
        }
    }
    public PlaceHolderTextBox()
    {
        GotFocus += removePlaceHolder;
        LostFocus += setPlaceholder;
    }

    private void setPlaceholder(object sender, EventArgs e)
    {
        setPlaceholder();
    }

    private void removePlaceHolder(object sender, EventArgs e)
    {
        removePlaceHolder();
    }
}

11
যখন অন্য কিছু নিয়ন্ত্রণ Textসম্পত্তির মানের উপর কাজ করে (যেমন একটি তালিকা ফিল্টার করার জন্য একটি পাঠ্যবক্স), স্থানধারক ফিল্টারিংয়ের জন্য ব্যবহৃত হবে। স্থানধারক মানটি কেবল প্রদর্শনের জন্য ব্যবহার করা উচিত, সুতরাং Textঅস্থায়ীভাবে সম্পত্তি প্রতিস্থাপন করা ভাল ধারণা নয় ।
রোল্যান্ড ইলিগ

1
ঝরঝরে সমাধান, আমি এটি পছন্দ করি। আমি ক্লাসের উপরে এই ব্যবহারগুলি যুক্ত করব, যাতে এটি কাজ করে যায়: এর using System; using System.Drawing; using System.Windows.Forms;জন্য ধন্যবাদ!
Eldoïr

18

এটি আমার কোড নয়, তবে আমি এটি প্রচুর ব্যবহার করি এবং এটি নিখুঁতভাবে কাজ করে ... কেবলমাত্র এক্সএএমএল

<TextBox x:Name="Textbox" Height="23" Margin="0,17,18.8,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" HorizontalAlignment="Right" ></TextBox>

<TextBlock x:Name="Placeholder" IsHitTestVisible="False" TextWrapping="Wrap" Text="Placeholder Text" VerticalAlignment="Top" Margin="0,20,298.8,0" Foreground="DarkGray" HorizontalAlignment="Right" Width="214">
  <TextBlock.Style>
    <Style TargetType="{x:Type TextBlock}">
      <Setter Property="Visibility" Value="Collapsed"/>
      <Style.Triggers>
        <DataTrigger Binding="{Binding Text, ElementName=Textbox}" Value="">
          <Setter Property="Visibility" Value="Visible"/>
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </TextBlock.Style>
</TextBlock>

1
কবজির মতো কাজ করে এবং যদি আপনি DataTriggerনিম্নলিখিতটি দ্বারা প্রতিস্থাপন করে আইসফোকাসে একটি ট্রিগার যুক্ত করেন তবে MultiDataTriggerএটি আমার বিনীত মতে আরও ভাল কাজ করে:<MultiDataTrigger><MultiDataTrigger.Conditions><Condition Binding="{Binding IsFocused, ElementName=Textbox}" Value="false" /><Condition Binding="{Binding Text, ElementName=Textbox}" Value="" /></MultiDataTrigger.Conditions><MultiDataTrigger.Setters> <Setter Property="Visibility" Value="Visible"/></MultiDataTrigger.Setters></MultiDataTrigger>
আক্কু

9

উদ্ধার করার জন্য সংযুক্ত বৈশিষ্ট্যগুলি:

public static class TextboxExtensions
{
    public static readonly DependencyProperty PlaceholderProperty = 
        DependencyProperty.RegisterAttached(
            "Placeholder", 
            typeof(string), 
            typeof(TextboxExtensions), 
            new PropertyMetadata(default(string), propertyChangedCallback: PlaceholderChanged)
            );

    private static void PlaceholderChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args)
    {
        var tb = dependencyObject as TextBox;

        if (tb == null)
            return;

        tb.LostFocus -= OnLostFocus;
        tb.GotFocus -= OnGotFocus;

        if (args.NewValue != null)
        {
            tb.GotFocus += OnGotFocus;
            tb.LostFocus += OnLostFocus;
        }

        SetPlaceholder(dependencyObject, args.NewValue as string);

        if (!tb.IsFocused)
            ShowPlaceholder(tb);
    }

    private static void OnLostFocus(object sender, RoutedEventArgs routedEventArgs)
    {
        ShowPlaceholder(sender as TextBox);
    }

    private static void OnGotFocus(object sender, RoutedEventArgs routedEventArgs)
    {
        HidePlaceholder(sender as TextBox);
    }

    [AttachedPropertyBrowsableForType(typeof(TextBox))]
    public static void SetPlaceholder(DependencyObject element, string value)
    {
        element.SetValue(PlaceholderProperty, value);
    }

    [AttachedPropertyBrowsableForType(typeof(TextBox))]
    public static string GetPlaceholder(DependencyObject element)
    {
        return (string)element.GetValue(PlaceholderProperty);
    }

    private static void ShowPlaceholder(TextBox textBox)
    {
        if (string.IsNullOrWhiteSpace(textBox.Text))
        {
            textBox.Text = GetPlaceholder(textBox);
        }
    }

    private static void HidePlaceholder(TextBox textBox)
    {
        string placeholderText = GetPlaceholder(textBox);

        if (textBox.Text == placeholderText)
            textBox.Text = string.Empty;
    }
}

ব্যবহার:

<TextBox Text="hi" local:TextboxExtensions.Placeholder="Hello there"></TextBox>

এই দুর্দান্ত সমাধান সরবরাহ করার জন্য ধন্যবাদ। তবে, আপনার সমাধানটি ব্যবহার করে, ক) ফলাফলের ফলে হালকা-ধূসর বর্ণের পরিবর্তে কালো স্থানধারক পাঠ্য এবং খ) অ্যাপ্লিকেশন শুরু হওয়ার পরে কোনও স্থানধারক পাঠ্য প্রদর্শন করে না (তবে ফোকাস দেওয়ার পরে এবং অন্য কোনও স্থানে ফোকাস সেট করার পরে)। এক্ষেত্রে আপনার উত্তরটির উন্নতি করতে আপনি কি আপত্তি করবেন?
Yoda

1
@ যোদা যদি আমি বাড়ি না পাওয়া পর্যন্ত এটি ভুলে না গিয়ে পরিচালনা করি তবে আমি এটির উন্নতি করতে দেখব, হ্যাঁ - কেন নয়
ডিবিএল

1
ফোকাসিং / ফোকাসিং স্থির না করা পর্যন্ত ফাঁকা স্থানধারক।
সের্গেই

1
@ যোদা হাই, এটি সাবধানতার সাথে করা হয়েছে এবং কিছু না ভাঙ্গলে আমার আপত্তি নেই।
সের্গেই

1
@ যোদা, দুঃখিত, আমি কিছুক্ষণ ডাব্লুপিএফ-এর সাথে কাজ করিনি, এই মুহুর্তে আমার এটি ইনস্টলও করা হয়নি। আপনি নামের PlaceholderColorসাথে অন্য নির্ভরতা সম্পত্তি যুক্ত করতে পারেন typeof(Brush)। তারপরে পদ্ধতিতে textBox.Foregroundসম্পত্তি পরিবর্তন করুন ShowPlaceholderএবং এটিকে পুনরায় ফিরিয়ে দিনHidePlaceholder
সের্গেই

5

EM_SETCUEBANNERবার্তাটি ব্যবহার করার সময় সম্ভবত সবচেয়ে সহজ, একটি জিনিস আমি পছন্দ করি না তা হ'ল নিয়ন্ত্রণ ফোকাস পেলে স্থানধারক পাঠ্যটি অদৃশ্য হয়ে যায়। আমি ফর্মগুলি পূরণ করার সময় এটি আমার পোষা প্রাণীর এক প্রজাতি। ক্ষেত্রটি কী তা মনে রাখার জন্য আমাকে এটি থেকে ক্লিক করতে হবে।

সুতরাং এখানে উইনফোর্ডগুলির জন্য আরও একটি সমাধান। এটি Labelনিয়ন্ত্রণের উপরে একটি ওভারলে দেয়, যা কেবল ব্যবহারকারী টাইপ করা শুরু করলে অদৃশ্য হয়ে যায়।

এটি অবশ্যই বুলেটপ্রুফ নয়। এটি যে কোনও গ্রহণ করে Control, তবে আমি কেবল একটি দিয়ে পরীক্ষা করেছি TextBox। কিছু নিয়ন্ত্রণ নিয়ে কাজ করার জন্য এটির সংশোধন প্রয়োজন হতে পারে। Labelকোনও নির্দিষ্ট ক্ষেত্রে আপনাকে যদি কিছুটা পরিবর্তন করতে হয় তবে পদ্ধতিটি নিয়ন্ত্রণটি ফিরিয়ে দেয় , তবে এটির কখনই প্রয়োজন হতে পারে না।

এটি এর মতো ব্যবহার করুন:

SetPlaceholder(txtSearch, "Type what you're searching for");

পদ্ধতিটি এখানে:

/// <summary>
/// Sets placeholder text on a control (may not work for some controls)
/// </summary>
/// <param name="control">The control to set the placeholder on</param>
/// <param name="text">The text to display as the placeholder</param>
/// <returns>The newly-created placeholder Label</returns>
public static Label SetPlaceholder(Control control, string text) {
    var placeholder = new Label {
        Text = text,
        Font = control.Font,
        ForeColor = Color.Gray,
        BackColor = Color.Transparent,
        Cursor = Cursors.IBeam,
        Margin = Padding.Empty,

        //get rid of the left margin that all labels have
        FlatStyle = FlatStyle.System,
        AutoSize = false,

        //Leave 1px on the left so we can see the blinking cursor
        Size = new Size(control.Size.Width - 1, control.Size.Height),
        Location = new Point(control.Location.X + 1, control.Location.Y)
    };

    //when clicking on the label, pass focus to the control
    placeholder.Click += (sender, args) => { control.Focus(); };

    //disappear when the user starts typing
    control.TextChanged += (sender, args) => {
        placeholder.Visible = string.IsNullOrEmpty(control.Text);
    };

    //stay the same size/location as the control
    EventHandler updateSize = (sender, args) => {
        placeholder.Location = new Point(control.Location.X + 1, control.Location.Y);
        placeholder.Size = new Size(control.Size.Width - 1, control.Size.Height);
    };

    control.SizeChanged += updateSize;
    control.LocationChanged += updateSize;

    control.Parent.Controls.Add(placeholder);
    placeholder.BringToFront();

    return placeholder;
}

4

এক্সেপশনলাইমেটকের উত্তরের ভিত্তিতে, একটি উন্নতি:

Color farbe;
string ph = "Placeholder-Text";

private void Form1_Load(object sender, EventArgs e)
{
    farbe = myTxtbx.ForeColor;
    myTxtbx.GotFocus += RemoveText;
    myTxtbx.LostFocus += AddText;
    myTxtbx.Text = ph;
}


public void RemoveText(object sender, EventArgs e)
{
    myTxtbx.ForeColor = farbe;
    if (myTxtbx.Text == ph)
        myTxtbx.Text = "";
}

public void AddText(object sender, EventArgs e)
{
    if (String.IsNullOrWhiteSpace(myTxtbx.Text))
    {
        myTxtbx.ForeColor = Color.Gray;
        myTxtbx.Text = ph;
    }
}

3

আপনি ডিফল্টটি পেতেTemplate পারেন , এটিকে ওভারলে করে এটিকে সংশোধন করতে পারেন এবং এটি ট্রিগার যুক্ত TextBlockকরতে একটি ব্যবহার Styleকরতে পারেন যা এটি লুকায়িত করে এবং সঠিক অবস্থায় প্রদর্শন করে।


3

এর অর্থ হ'ল আপনার কাছে একটি বোতাম রয়েছে যা আপনাকে কোনও ক্রিয়া করতে দেয় যেমন লগ ইন বা কোনও কিছু। আপনি ক্রিয়াটি করার আগে আপনি পরীক্ষা করে দেখুন যে পাঠ্যবক্সটি পূরণ করা হয়েছে কিনা তা না হলে এটি পাঠ্যটি প্রতিস্থাপন করবে

 private void button_Click(object sender, EventArgs e)
 {
     string textBoxText = textBox.Text;

     if (String.IsNullOrWhiteSpace(textBoxText))
     {
         textBox.Text = "Fill in the textbox";
     }
 }

 private void textBox_Enter(object sender, EventArgs e)
 {
     TextBox currentTextbox = sender as TextBox;
     if (currentTextbox.Text == "Fill in the textbox")
     {
         currentTextbox.Text = "";
     }
 }

এটি এক প্রকারের উদ্বেগজনক তবে আপনি যে মানটি দিচ্ছেন তার জন্য পাঠ্য যাচাই করা ভাল আমি এটিএমই করতে পারি সেরা, আরও ভাল সমাধান পাওয়ার জন্য সি # তে ভাল নয়।


2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;

namespace App_name
{
   public class CustomTextBox : TextBox
    {
        private string Text_ = "";
        public CustomTextBox() : base()
        {}

        public string setHint
        {
            get { return Text_; }
            set { Text_ = value; }
        }
        protected override void OnGotFocus(RoutedEventArgs e)
        {
            base.OnGotFocus(e);
            if (Text_.Equals(this.Text))
                this.Clear();
        }
        protected override void OnLostFocus(RoutedEventArgs e)
        {
            base.OnLostFocus(e);
            if (String.IsNullOrWhiteSpace(this.Text))
                this.Text = Text_;
        }
    }
}
>    xmlns:local="clr-namespace:app_name"
>  <local:CustomTextBox
>                 x:Name="id_number_txt"
>                 Width="240px"
>                 Height="auto"/>

আপনার উত্তরে কেবল একটি গুচ্ছ কোড ডাম্প করার পরিবর্তে আপনার উত্তরটি ব্যাখ্যা করুন।
ফান্ড মনিকার লসুইট

1

আমি এমন একটি পদ্ধতি নিয়ে এসেছি যা আমার পক্ষে কাজ করেছিল তবে কেবলমাত্র আমি আমার স্থানধারক হিসাবে পাঠ্যবক্সের নামটি ব্যবহার করতে ইচ্ছুক ছিলাম। নিচে দেখ.

public TextBox employee = new TextBox();

private void InitializeHomeComponent()
{
    //
    //employee
    //
    this.employee.Name = "Caller Name";
    this.employee.Text = "Caller Name";
    this.employee.BackColor = System.Drawing.SystemColors.InactiveBorder;
    this.employee.Location = new System.Drawing.Point(5, 160);
    this.employee.Size = new System.Drawing.Size(190, 30);
    this.employee.TabStop = false;
    this.Controls.Add(employee);
    // I loop through all of my textboxes giving them the same function
    foreach (Control C in this.Controls)
    {
        if (C.GetType() == typeof(System.Windows.Forms.TextBox))
        {
            C.GotFocus += g_GotFocus;
            C.LostFocus += g_LostFocus;
        }
     }
 }

    private void g_GotFocus(object sender, EventArgs e)
    {
        var tbox = sender as TextBox;
        tbox.Text = "";
    }

    private void g_LostFocus(object sender, EventArgs e)
    {
        var tbox = sender as TextBox;
        if (tbox.Text == "")
        {
            tbox.Text = tbox.Name;
        }
    }

1

এখানে আমি @ কমল কারাডাগ দ্বারা অনুপ্রাণিত এই সমাধানটি নিয়ে আসছি।

আমি লক্ষ্য করেছি যে এখানে পোস্ট প্রতিটি সমাধান ফোকাসের উপর নির্ভর করে,

যখন আমি চেয়েছিলাম যে আমার স্থানধারক গুগল ক্রোমে কোনও মানক এইচটিএমএল স্থানধারকের হুবহু ক্লোন হয়ে উঠুক।

বক্সটি ফোকাস করার সময় স্থানধারককে লুকিয়ে / দেখানোর পরিবর্তে,

আমি বাক্সের পাঠ্যের দৈর্ঘ্যের উপর নির্ভর করে স্থানধারককে লুকিয়ে / দেখিয়েছি:

বাক্সটি ফাঁকা থাকলে, স্থানধারকটি প্রদর্শিত হয় এবং আপনি বাক্সে টাইপ করলে স্থানধারক অদৃশ্য হয়ে যায়।

যেহেতু এটি একটি স্ট্যান্ডার্ড টেক্সটবক্স থেকে উত্তরাধিকার সূত্রে প্রাপ্ত, আপনি এটি আপনার টুলবক্সে খুঁজে পেতে পারেন!

using System;
using System.Drawing;
using System.Windows.Forms;

public class PlaceHolderTextBox : TextBox
{
    private bool isPlaceHolder = true;
    private string placeHolderText;

    public string PlaceHolderText
    {
        get { return placeHolderText; }
        set
        {
            placeHolderText = value;
            SetPlaceholder();
        }
    }

    public PlaceHolderTextBox()
    {
        TextChanged += OnTextChanged;
    }

    private void SetPlaceholder()
    {
        if (!isPlaceHolder)
        {
            this.Text = placeHolderText;
            this.ForeColor = Color.Gray;
            isPlaceHolder = true;
        }
    }

    private void RemovePlaceHolder()
    {
        if (isPlaceHolder)
        {
            this.Text = this.Text[0].ToString(); // Remove placeHolder text, but keep the character we just entered
            this.Select(1, 0); // Place the caret after the character we just entered
            this.ForeColor = System.Drawing.SystemColors.WindowText;
            isPlaceHolder = false;
        }
    }

    private void OnTextChanged(object sender, EventArgs e)
    {
        if (this.Text.Length == 0)
        {
            SetPlaceholder();
        }
        else
        {
            RemovePlaceHolder();
        }
    }
}

0

নিম্নলিখিত কোড ব্যবহার করে দেখুন:

<TextBox x:Name="InvoiceDate" Text="" Width="300"  TextAlignment="Left" Height="30" Grid.Row="0" Grid.Column="3" Grid.ColumnSpan="2" />
                    <TextBlock IsHitTestVisible="False" Text="Men att läsa" Width="300"  TextAlignment="Left" Height="30" Grid.Row="0" Grid.Column="3" Grid.ColumnSpan="2" Padding="5, 5, 5, 5"  Foreground="LightGray">
                        <TextBlock.Style>
                            <Style TargetType="{x:Type TextBlock}">
                                <Setter Property="Visibility" Value="Collapsed"/>
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding Text, ElementName=InvoiceDate}" Value="">
                                        <Setter Property="Visibility" Value="Visible"/>
                                    </DataTrigger>
                                    <DataTrigger Binding="{Binding ElementName=InvoiceDate, Path=IsFocused}" Value="True">
                                        <Setter Property="Visibility" Value="Collapsed"/>
                                    </DataTrigger>

                                </Style.Triggers>
                            </Style>
                        </TextBlock.Style>
                    </TextBlock>


0

আপনি মাউস ক্লিক করলে এটিও করতে পারেন, ধরুন আপনার স্থানধারক পাঠ্যটি "ব্যবহারকারীর নাম"

 private void textBox1_MouseClick(object sender, MouseEventArgs e)
 {
     if(textBox1.Text == "User_Name")
          textBox1.Text = "";
 }

0
    public void Initialize()
    {
        SetPlaceHolder(loginTextBox, " Логин ");
        SetPlaceHolder(passwordTextBox, " Пароль ");
    }

    public void SetPlaceHolder(Control control, string PlaceHolderText)
    {
        control.Text = PlaceHolderText;
        control.GotFocus += delegate(object sender, EventArgs args) {
            if (control.Text == PlaceHolderText)
            {
                control.Text = "";
            }
        };
        control.LostFocus += delegate(object sender, EventArgs args){
            if (control.Text.Length == 0)
            {
                control.Text = PlaceHolderText;
            }
        };
    }

5
প্রশ্নটি ইতিমধ্যে সমাধান করা হয়েছে, এই উত্তরের যুক্ত মূল্য কী ব্যবহার করছে? এখানে কোনও ব্যাখ্যা নেই সমস্ত যুক্ত করুন, এটি ব্যাখ্যা করার চেষ্টা করুন।
জান্নিক

0

পাঠ্যবক্সের। পাঠ্য সম্পত্তিটি ব্যবহার করার পরিবর্তে, আমি স্থানধারকের সাথে একটি পাঠ্যব্লককে ওভারলেড করেছি। আমি .Txt সম্পত্তিটি ব্যবহার করতে পারিনি কারণ এটি একটি ইভেন্টের সাথে আবদ্ধ ছিল।

XAML:

<Canvas Name="placeHolderCanvas">
    <TextBox  AcceptsReturn="True" Name="txtAddress" Height="50" Width="{Binding ActualWidth, ElementName=placeHolderCanvas}"
              Tag="Please enter your address"/>
</Canvas>

VB.NET

Public Shared Sub InitPlaceholder(canvas As Canvas)
    Dim txt As TextBox = canvas.Children.OfType(Of TextBox).First()
    Dim placeHolderLabel = New TextBlock() With {.Text = txt.Tag,
                                                 .Foreground = New SolidColorBrush(Color.FromRgb(&H77, &H77, &H77)),
                                                 .IsHitTestVisible = False}
    Canvas.SetLeft(placeHolderLabel, 3)
    Canvas.SetTop(placeHolderLabel, 1)
    canvas.Children.Add(placeHolderLabel)
    AddHandler txt.TextChanged, Sub() placeHolderLabel.Visibility = If(txt.Text = "", Visibility.Visible, Visibility.Hidden)
End Sub

ফলাফল: এখানে চিত্র বর্ণনা লিখুন


0

আপনিও এইভাবে চেষ্টা করতে পারেন ..

ফাংশন কল

TextboxPlaceHolder(this.textBox1, "YourPlaceHolder");

এই ফাংশন লিখুন

private void TextboxPlaceHolder(Control control, string PlaceHolderText)
{
        control.Text = PlaceHolderText;
        control.GotFocus += delegate (object sender, EventArgs args)
        {
            if (cusmode == false)
            {
                control.Text = control.Text == PlaceHolderText ? string.Empty : control.Text;
                //IF Focus TextBox forecolor Black
                control.ForeColor = Color.Black;
            }
        };

        control.LostFocus += delegate (object sender, EventArgs args)
        {
            if (string.IsNullOrWhiteSpace(control.Text) == true)
            {
                control.Text = PlaceHolderText;
                //If not focus TextBox forecolor to gray
                control.ForeColor = Color.Gray;
            }

        };
}

0

এখানে আরও ভাল সমাধান রয়েছে, তবে সবচেয়ে সহজ সমাধানটি এখানে: পাঠ্যবাক্স পাঠ্যকে আপনার পছন্দসই স্ট্রিংয়ে সেট করুন তারপরে এমন একটি ফাংশন তৈরি করুন যা পাঠ্য মুছে ফেলবে, সেই ফাংশনটিতে পাঠ্যবক্সে আগুন ফোকাস প্রবেশ করুন ইভেন্ট দিন


0

আমি একটি পুনঃব্যবহারযোগ্য কাস্টম নিয়ন্ত্রণ লিখেছি, সম্ভবত এটি এমন কাউকে সহায়তা করতে পারে যার প্রজেক্টে একাধিক স্থানধারক পাঠ্যবাক্সগুলি প্রয়োগ করতে হবে।
এখানে উদাহরণের বাস্তবায়নের উদাহরণ সহ কাস্টম ক্লাস রয়েছে, আপনি ভিএস ব্যবহার করে একটি নতুন উইনফর্ম প্রকল্পে এই কোডটি আটকে দিয়ে সহজেই পরীক্ষা করতে পারেন:

namespace reusebleplaceholdertextbox
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // implementation
            CustomPlaceHolderTextbox myCustomTxt = new CustomPlaceHolderTextbox(
                "Please Write Text Here...", Color.Gray, new Font("ARIAL", 11, FontStyle.Italic)
                , Color.Black, new Font("ARIAL", 11, FontStyle.Regular)
                );

            myCustomTxt.Multiline = true;
            myCustomTxt.Size = new Size(200, 50);
            myCustomTxt.Location = new Point(10, 10);
            this.Controls.Add(myCustomTxt);
        }
    }

    class CustomPlaceHolderTextbox : System.Windows.Forms.TextBox
    {
        public string PlaceholderText { get; private set; }
        public Color PlaceholderForeColor { get; private set; }
        public Font PlaceholderFont { get; private set; }

        public Color TextForeColor { get; private set; }
        public Font TextFont { get; private set; }

        public CustomPlaceHolderTextbox(string placeholdertext, Color placeholderforecolor,
            Font placeholderfont, Color textforecolor, Font textfont)
        {
            this.PlaceholderText = placeholdertext;
            this.PlaceholderFont = placeholderfont;
            this.PlaceholderForeColor = placeholderforecolor;
            this.PlaceholderFont = placeholderfont;
            this.TextForeColor = textforecolor;
            this.TextFont = textfont;
            if (!string.IsNullOrEmpty(this.PlaceholderText))
            {
                SetPlaceHolder(true);
                this.Update();
            }
        }

        private void SetPlaceHolder(bool addEvents)
        {
            if (addEvents)
            {  
                this.LostFocus += txt_lostfocus;
                this.Click += txt_click;
            }

            this.Text = PlaceholderText;
            this.ForeColor = PlaceholderForeColor;
            this.Font = PlaceholderFont;
        }

        private void txt_click(object sender, EventArgs e)
        {
            // IsNotFirstClickOnThis:
            // if there is no other control in the form
            // we will have a problem after the first load
            // because we dont other focusable control to move the focus to
            // and we dont want to remove the place holder
            // only on first time the place holder will be removed by click event
            RemovePlaceHolder();
            this.GotFocus += txt_focus;
            // no need for this event listener now
            this.Click -= txt_click;
        }

        private void RemovePlaceHolder()
        {
            this.Text = "";
            this.ForeColor = TextForeColor;
            this.Font = TextFont;
        }
        private void txt_lostfocus(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(this.Text))
            {
                // set placeholder again
                SetPlaceHolder(false);
            }
        }

        private void txt_focus(object sender, EventArgs e)
        {
            if (this.Text == PlaceholderText)
            {
                // IsNotFirstClickOnThis:
                // if there is no other control in the form
                // we will have a problem after the first load
                // because we dont other focusable control to move the focus to
                // and we dont want to remove the place holder
                RemovePlaceHolder();
            }
        }
    }
}

-1

উইন্ডোজফর্মগুলি টেক্সটবক্স নিয়ন্ত্রণের জন্য এখানে খুব কার্যকর সমাধান । (এক্সএএমএল সম্পর্কে নিশ্চিত নয়)।

এটি মাল্টিলিন মোডেও কাজ করবে।

সম্ভবত এটি অন্যান্য নিয়ন্ত্রণের জন্যও বাড়ানো যেতে পারে যেমন কম্বোবক্স নিয়ন্ত্রণ (চেক করা হয়নি)


-1

একটি যাদুমন্ত্র মত কাজ করে.

public class WTextBox : TextBox
{
    private string _placeholder;


    [Category("Appearance")]
    public string Placeholder
    {
        get { return _placeholder; }
        set
        {
            _placeholder = value ?? string.Empty;
            Invalidate();
        }
    }

    public WTextBox()
    {
        _placeholder = string.Empty;
    }

    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);

        if (m.Msg != 0xF || Focused || !string.IsNullOrEmpty(Text) || string.IsNullOrWhiteSpace(_placeholder))
        {
            return;
        }

        using (var g = CreateGraphics())
        {
            TextRenderer.DrawText(g, _placeholder, Font, ClientRectangle, SystemColors.GrayText, BackColor, TextFormatFlags.Left);
        }
    }
}

দয়া করে প্রয়োজনীয় usings যোগ করুন
আক্কু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.