Как добавить текст подсказки в текстовое поле WPF? - PullRequest
96 голосов
/ 15 сентября 2011

Например, у Facebook есть текст подсказки «Поиск» в текстовом поле «Поиск», когда текстовое поле пустое.

Как этого добиться с помощью текстовых полей WPF ??

Facebook's search textbox

Ответы [ 13 ]

0 голосов
/ 14 октября 2014

Я выполняю это с 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 Design не загружается ... появляется следующая ошибка: Неоднозначная ссылка на тип. Тип с именем «StaticExtension» встречается как минимум в двух пространствах имен: «MS.Internal.Metadata.ExposedTypes.Xaml» и «System.Windows.Markup». Попробуйте настроить атрибуты сборки XmlnsDefinition. использую .net 3.5

0 голосов
/ 02 июля 2012

Я использовал события полученного и потерянного фокуса:

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

0 голосов
/ 15 сентября 2011

Для 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 Framework, который вы можете скачать бесплатно здесь .

Вот статья о BitFlex, если вам нужна дополнительная информация. Вы начнете находить, что если вам нужны элементы управления в стиле проводника Windows, то, как правило, они никогда не выходят из коробки, а поскольку WPF не работает с дескрипторами, вы, как правило, не можете написать простую оболочку для Win32 или существующий элемент управления с WinForms.

Скриншот: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...