programing

힌트 텍스트를 WPF 텍스트 상자에 추가하려면 어떻게 해야 합니까?

elseif 2023. 4. 19. 22:25

힌트 텍스트를 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}}" IsHitTestVisible="False"/>
        <!-- enter term here -->
        <TextBox MinWidth="50" Name="txtSearchBox" Background="Transparent" />
    </Grid>

materialDesignHintAssist를 사용하는 것은 어떻습니까?저는 이것을 사용하고 있습니다.또, 플로팅 힌트를 추가할 수도 있습니다.

<TextBox Width="150" Height="40" Text="hello" materialDesign:HintAssist.Hint="address"  materialDesign:HintAssist.IsFloating="True"></TextBox>

Nuget 패키지와 함께 Material Design을 설치했습니다.설명서 링크에 설치 가이드가 있습니다.

처음에 텍스트 색상을 회색으로 설정하고 키보드 포커스를 얻거나 잃기 위한 이벤트 핸들러를 추가하여 코드 비하인드로 수행합니다.

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" />

보너스: textBox의 디폴트값을 설정하려면 , 데이터 송신시에 반드시 설정해 주세요(예:빈 경우 InputText"="PlaceHolder Text Here"를 선택합니다.

나도 한번 같은 상황에 처하면, 나는 그것을 다음과 같이 해결했다.저는 힌트 박스의 요건을 충족시켰을 뿐이므로, 포커스 등 다른 이벤트에 효과나 다른 것을 추가함으로써 보다 인터랙티브하게 할 수 있습니다.

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;
        }
    }

또 다른 접근법;-)

이것은 와도 동작합니다.PasswordBox에서 TextBox exchange , 「 」PasswordChangedTextChanged.

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;
    }
}

또 다른 솔루션은 MahApps와 같은 WPF 툴킷을 사용하는 것입니다.Metro. 텍스트 박스 워터마크와 같은 멋진 기능들이 많이 있습니다.

Controls:TextBoxHelper.Watermark="Search..."

http://mahapps.com/controls/textbox.html 를 참조해 주세요.

get 및 lost focus 이벤트를 사용했습니다.

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를 쓰고 있었어요.그물

  <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'에서 발생합니다.내부.메타데이터[ Exposed Types ](익스포드 타입)Xaml'과 'System'입니다.윈도마크업' 어셈블리 XmlnsDefinition 특성을 조정하는 것이 좋습니다..net 3.5 사용 중

WPF의 경우 방법이 없습니다.성대모사 해야 돼요. 예를 참조해 주세요.세컨더리(플라이크솔루션)는 TextBox에서 상속되는 WinForms 사용자 컨트롤을 호스트하여 편집 컨트롤에 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 Framework는 여기에서 무료로 다운로드할 수 있습니다.

자세한 내용은 BitFlex에 대한 기사입니다.Windows 탐색기 스타일을 사용하고 싶은 경우는, 통상, 이 조작은 곧바로 실시할 수 없습니다.WPF는 핸들에서 동작하지 않기 때문에, Win32나 기존의 컨트롤에 대해서 WinForms와 같이 간단하게 래퍼를 작성할 수 없습니다.

스크린샷:여기에 이미지 설명 입력

언급URL : https://stackoverflow.com/questions/7425618/how-can-i-add-a-hint-text-to-wpf-textbox