Заполнитель текстового поля Powershell - PullRequest
1 голос
/ 11 февраля 2020

Я создаю свой из, определяю свои текстовые поля, и для моего текста заполнителя я использую следующий код:

$AssetText.Add_MouseClick({ $AssetText.text = “” })
$ErrorText.Add_MouseClick({ $ErrorText.text = “” })
$IssueText.Add_MouseClick({ $IssueText = “” })
$TestTagText.Add_MouseClick({ $TestTagText.text = “” })
$TroubleshootText.Add_MouseClick({  $TroubleshootText.text = “” })
$ResolutionText.Add_MouseClick({ $ResolutionText.text = “” })

Он работает для удаления текста из текстового поля, но если я набираю изрядное количество текста в любом текстовом поле, а затем щелкните за его пределами, а затем вернитесь к нему, он стирает текст, над которым я работал.

Есть ли другая функция, которую я могу использовать, которая будет работать лучше, чем этот текущий метод? Так что сначала я могу щелкнуть $ TextBox, чтобы текст исчез, но при написании собственного текста в поле он не исчезнет после нажатия внутри и снаружи $ TextBox?

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Вот еще один подход к настройке текста заполнителя для текстового поля. Подход основан на обработке WM_PAINT сообщения и был объяснен и реализован здесь .

Разница между этим подходом и другим подходом (отправка EM_SETCUEBANNER) заключается в том, что этот подход работает и для многострочного TextBox.

enter image description here

using assembly System.Windows.Forms
using namespace System.Windows.Forms
using namespace System.Drawing
$assemblies = "System.Windows.Forms", "System.Drawing"
$code = @"
using System.Drawing;
using System.Windows.Forms;
public class ExTextBox : TextBox
{
    string hint;
    public string Hint
    {
        get { return hint; }
        set { hint = value; this.Invalidate(); }
    }
    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
        if (m.Msg == 0xf)
        {
            if (!this.Focused && string.IsNullOrEmpty(this.Text)
                && !string.IsNullOrEmpty(this.Hint))
            {
                using (var g = this.CreateGraphics())
                {
                    TextRenderer.DrawText(g, this.Hint, this.Font,
                        this.ClientRectangle, SystemColors.GrayText , this.BackColor, 
                        TextFormatFlags.Top | TextFormatFlags.Left);
                }
            }
        }
    }
}
"@
#Add the SendMessage function as a static method of a class
Add-Type -ReferencedAssemblies $assemblies -TypeDefinition $code -Language CSharp   

# Create an instance of MyForm.
$form = [Form] @{
    ClientSize = [Point]::new(400,100);
    Text = "Placeholder Sample";
}    
$form.Controls.AddRange(@(
    ($textBox1 = [ExTextBox] @{Location = [Point]::new(10,10); Hint = "Start typing!" })
    ($textBox2 = [ExTextBox] @{Location = [Point]::new(10,40); Hint = "Start typing!"; 
         MultiLine = $true; Height = 50; })
))
$null = $form.ShowDialog()
$form.Dispose()
1 голос
/ 11 февраля 2020

Если вы хотите использовать местозаполнитель в родном режиме ОС, вы можете отправить EM_SETCUEBANNER на TextBox, чтобы задать текст заполнителя:

enter image description here

using assembly System.Windows.Forms
using namespace System.Windows.Forms
using namespace System.Drawing
$code = @"
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern IntPtr SendMessage(IntPtr hWnd, 
    int msg, IntPtr wParam, string lParam);  
public const int EM_SETCUEBANER = 0x1501;
"@
$Win32Helpers = Add-Type -MemberDefinition $code -Name "Win32Helpers" -PassThru
$form = [Form] @{
    ClientSize = [Point]::new(400,100);
    Text = "Placeholder Text";
}    
$form.Controls.AddRange(@(
    ($textBox1 = [TextBox] @{Location = [Point]::new(10,10) })
    ($textBox2 = [TextBox] @{Location = [Point]::new(10,40) })
))
$textBox1.add_HandleCreated({
    $Win32Helpers::SendMessage($textBox1.Handle,$Win32Helpers::EM_SETCUEBANER`
         , [IntPtr]0, "Start typing ...")
    $Win32Helpers::SendMessage($textBox2.Handle,$Win32Helpers::EM_SETCUEBANER`
         , [IntPtr]0, "Start typing ...")
})
$null = $form.ShowDialog()
$form.Dispose()
...