Estou procurando uma maneira de adicionar texto de espaço reservado a uma caixa de texto como você pode com uma caixa de texto em html5.
Ou seja, se a caixa de texto não tiver texto, ele será adicionado Enter some text here
; quando o usuário clicar nela, o texto do espaço reservado desaparecerá e permitirá que o usuário insira seu próprio texto; se a caixa de texto perder o foco e ainda não houver texto, o espaço reservado será adicionado de volta à caixa de texto.
c#
wpf
placeholder
Boardy
fonte
fonte
Respostas:
Não seria algo assim:
Isso é apenas pseudocódigo, mas o conceito está lá.
fonte
RemoveText
eAddText
método deve serpublic void
, ausente nulo . E como @BibaswannBandyopadhyay disse, oRemoveText
método poderia ser esta:if (myTxtbx.Text == "Enter text here...") {myTxtbx.Text = "";}
Você pode usar isso, está funcionando para mim e é uma solução extremamente simples.
Uso:
O que outras pessoas estão dizendo
fonte
<ControlTemplate.Triggers> <Trigger Property="IsFocused" Value="True"> <Setter Property="FocusManager.FocusedElement" TargetName="textSource" Value="{Binding RelativeSource={RelativeSource Self}}" /> </Trigger> </ControlTemplate.Triggers>
TextWrapping="wrap"
ambas as tags TextBox no Style, caso você queira criar uma TextBox com várias linhas com texto Placeholder como eu.<TextBox Text="{Binding Path=Text, RelativeSource=RelativeSource TemplatedParent}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" x:Name="textSource" Background="Transparent" Panel.ZIndex="2" MaxLength="{TemplateBinding MaxLength}" />
. No seu caso, você provavelmente precisará adicionarAcceptsReturn="{TemplateBinding AcceptsReturn}"
Em vez de manipular os eventos de entrada e saída de foco para definir e remover o texto do espaço reservado, é possível usar a função SendMessage do Windows para enviar
EM_SETCUEBANNER
mensagem para a nossa caixa de texto para fazer o trabalho por nós.Isso pode ser feito com duas etapas fáceis. Primeiro, precisamos expor a
SendMessage
função do Windows .Em seguida, basta chamar o método com o identificador de nossa caixa de texto, o valor de EM_SETCUEBANNER e o texto que queremos definir.
Referência: definir texto de espaço reservado para caixa de texto (texto de sugestão)
fonte
Adicione essa classe ao seu projeto e construa sua solução. Clique na caixa de ferramentas no visual studio e você verá um novo componente da caixa de texto chamado PlaceholderTextBox. Exclua sua caixa de texto atual no formulário de designe e substitua por PlaceHolderTextBox.
PlaceHolderTextBox tem uma propriedade PlaceHolderText. Defina qualquer texto que desejar e tenha um bom dia :)
fonte
Text
propriedade (por exemplo, uma caixa de texto usada para filtrar uma lista), o espaço reservado será usado para filtrar. O valor do espaço reservado deve ser usado apenas para exibição, portanto, não é uma boa ideia substituir aText
propriedade temporariamente.using System; using System.Drawing; using System.Windows.Forms;
Obrigado por isso!Este não é o meu código, mas eu o uso muito e funciona perfeitamente ... SOMENTE XAML
fonte
DataTrigger
o seguinte pelo seguinteMultiDataTrigger
, ele funcionará ainda melhor na minha humilde opinião:<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>
Propriedades anexadas ao resgate:
Uso:
fonte
PlaceholderColor
comtypeof(Brush)
. Em seguida, altere atextBox.Foreground
propriedade noShowPlaceholder
método e restaure-a novamente noHidePlaceholder
método.Embora o uso da
EM_SETCUEBANNER
mensagem seja provavelmente mais simples, uma coisa de que não gosto é que o texto do espaço reservado desaparece quando o controle fica em foco. É uma irritação minha quando estou preenchendo formulários. Preciso clicar nele para lembrar para que serve o campo.Então, aqui está outra solução para o WinForms. Sobrepõe um
Label
no topo do controle, que desaparece apenas quando o usuário começa a digitar.Certamente não é à prova de balas. Ele aceita qualquer
Control
, mas eu só testei com aTextBox
. Pode ser necessário modificar para trabalhar com alguns controles. O método retorna oLabel
controle caso você precise modificá-lo um pouco em um caso específico, mas isso pode nunca ser necessário.Use-o assim:
Aqui está o método:
fonte
Com base na resposta de ExceptionLimeCat, uma melhoria:
fonte
Você pode obter o padrão
Template
, modificá-lo sobrepondo aeTextBlock
usar aStyle
para adicionar gatilhos que ocultam e mostram nos estados certos.fonte
Isso significa que você tem um botão que permite executar uma ação, como fazer login ou algo assim. Antes de executar a ação, verifique se a caixa de texto está preenchida. Caso contrário, ela substituirá o texto
É meio extravagante, mas verificar o texto quanto ao valor que você está dando é o melhor que posso fazer em atm, não tão bom em c # para obter uma solução melhor.
fonte
fonte
Eu vim com um método que funcionou para mim, mas apenas porque estava disposto a usar o nome da caixa de texto como meu espaço reservado. Ver abaixo.
fonte
Aqui eu venho com esta solução inspirada em @Kemal Karadag.
Percebi que todas as soluções postadas aqui dependem do foco,
Embora eu desejasse que meu espaço reservado fosse o clone exato de um espaço reservado HTML padrão no Google Chrome.
Em vez de ocultar / mostrar o espaço reservado quando a caixa estiver focada,
Eu oculto / mostro o espaço reservado, dependendo do tamanho do texto da caixa:
Se a caixa estiver vazia, o espaço reservado será mostrado e, se você digitar na caixa, o espaço reservado desaparecerá.
Como é herdado de um TextBox padrão, você pode encontrá-lo na sua Caixa de Ferramentas!
fonte
Tente o seguinte código:
fonte
txtUsuario.Attributes.Add ("marcador de posição", "Texto");
fonte
você também pode fazer isso quando o mouse clicar, vamos supor que o texto do espaço reservado seja "Nome_do_Usuário"
fonte
fonte
Em vez de usar a propriedade .Text de um TextBox, sobreponha um TextBlock com o espaço reservado. Não pude usar a propriedade .Text porque isso estava vinculado a um evento.
XAML:
VB.NET
Resultado:
fonte
Você também pode tentar dessa maneira ..
chame a função
escreva esta função
fonte
existem soluções MELHORES, mas a solução mais fácil está aqui: defina o texto da caixa de texto com a string desejada e crie uma função que exclua o texto, faça com que essa função seja acionada na caixa de texto Evento Focus Enter
fonte
Eu escrevi um controle personalizado reutilizável, talvez possa ajudar alguém que precise implementar várias caixas de texto de espaço reservado em seu projeto.
aqui está a classe personalizada com exemplo de implementação de uma instância, você pode testar facilmente colando esse código em um novo projeto winforms usando o VS:
fonte
Solução muito eficaz aqui para o controle WindowsForms TextBox. (não tenho certeza sobre XAML).
Isso funcionará também no modo Multilinha.
Provavelmente pode ser estendido para outros controles, como o controle ComboBox (não marcado)
fonte
Funciona como um encanto.
fonte