Como faço para dar uma caixa de texto Foco no Silverlight?
-
02-07-2019 - |
Pergunta
Na minha aplicação Silverlight, eu não consigo trazer o foco para um controle TextBox. Na recomendação de vários postos, eu definir a propriedade IsTabStop como True e eu estou usando TextBox.Focus (). Embora o evento UserControl_Loaded está disparando, o controle TextBox não está recebendo o foco. Eu incluí meu código muito simples abaixo. o que estou perdendo? Obrigado.
Page.xaml
<UserControl x:Class="TextboxFocusTest.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Loaded="UserControl_Loaded"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<StackPanel Width="150" VerticalAlignment="Center">
<TextBox x:Name="RegularTextBox" IsTabStop="True" />
</StackPanel>
</Grid>
</UserControl>
Page.xaml.cs
using System.Windows;
using System.Windows.Controls;
namespace PasswordTextboxTest
{
public partial class Page : UserControl
{
public Page()
{
InitializeComponent();
}
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
RegularTextBox.Focus();
}
}
}
Solução
Eu achei essa mensagem em silverlight.net, e foi capaz de obtê-lo para trabalhar para mim, adicionando uma chamada para System.Windows.Browser.HtmlPage.Plugin.Focus () antes de chamar RegularTextBox.Focus ():
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
System.Windows.Browser.HtmlPage.Plugin.Focus();
RegularTextBox.Focus();
}
Outras dicas
Plugin.Focus();
não funciona para mim.
Chamando
Dispatcher.BeginInvoke(() => { tbNewText.Focus();});
A partir do evento de carga funcionou.
graças Santiago Palladino Dispatcher trabalhou para mim perfeitamente. O que estou fazendo é:
this.Focus (); então Dispatcher.BeginInvoke (() => {tbNewText.Focus ();});
Eu resolvi colocar no construtor de controle:
this.TargetTextBox.Loaded += (o, e) => { this.TargetTextBox.Focus(); };
Tem certeza de que não estamos realmente ficando foco? Há um erro conhecido no Beta 2, onde você vai ter foco e ser capaz de escrever, mas você não vai obter o acento circunflexo ou a fronteira. A solução é chamar UpdateLayout () sobre o direito de caixa de texto antes de chamar Focus ().
Gostaria de tentar adicionar um DispatcherTimer no evento UserLoaded que executa o método Foco alguns milissegundos após todo o controle foi carregado; talvez o problema está lá.
Eu também precisava chamar
Deployment.Current.Dispatcher.BeginInvoke (() => myTextbox.Focus ());
Curiosamente esta chamada está acontecendo dentro de um manipulador de eventos quando eu clique de mouse em um TextBlock, recolher a TextBlock e fazer o TextBox Visible. Se eu não segui-lo por um Dispatcher.BeginInvoke não vai obter o foco.
-Mike
código que você defina o foco está correto, pois se você adicionar um botão que chama o mesmo código funciona perfeitamente:
<StackPanel Width="150" VerticalAlignment="Center">
<TextBox x:Name="RegularTextBox" IsTabStop="True" />
<Button Click="UserControl_Loaded">
<TextBlock Text="Test"/>
</Button>
</StackPanel>
Então, eu estou supondo que isso é algo a ver com a Focus () exigindo algum tipo de interação com o usuário. Eu não poderia obtê-lo para trabalhar com um evento MouseMove no UserControl, mas colocando um evento KeyDown para definir as obras de foco (embora o modelo não atualizar para o modelo focado).
Width="400" Height="300" Loaded="UserControl_Loaded" KeyDown="UserControl_KeyDown">
Parece que um bug para mim ....
Para out-of-browser Apps O System.Windows.Browser.HtmlPage.Plugin.Focus();
não existe.
Consulte minha pergunta aqui para outras idéias.
Ele funciona para mim em SL4 e IE7 e Firefox 3.6.12
final faltando "peça" que tornou o foco para o trabalho (para mim) foi a criação .TabIndex propriedade
System.Windows.Browser.HtmlPage.Plugin.Focus();
txtUserName.IsTabStop = true;
txtPassword.IsTabStop = true;
if (txtUserName.Text.Trim().Length != 0)
{
txtPassword.UpdateLayout();
txtPassword.Focus();
txtPassword.TabIndex = 0;
}
else
{
txtUserName.UpdateLayout();
txtUserName.Focus();
txtUserName.TabIndex = 0;
}
Meu perfil não é bom o suficiente para comentário sobre o @ Jim BG resposta mas o que funcionou para mim foi adicionar um manipulador para o evento Loaded no RichTextBox e interior que manipulador add
System.Windows.Browser.HtmlPage.Plugin.Focus();
<YourTextBox>.UpdateLayout()
<YourTextBox>.Focus();
No entanto, ele só trabalhou no IE e FF. Para obtê-lo trabalhar no Chrome e Safari, rolar para o fundo da este
Eu esqueci uma coisa ... eu não encontrei uma maneira de foco força para a sua aplicação Silverlight na página confiável (ele irá funcionar em alguns navegadores e não em outros).
Por isso, pode ser que o aplicativo Silverlight em si não tem foco. Eu costumo enganar o usuário a clicar em um botão ou algo semelhante antes de eu começar a esperar a entrada do teclado para se certificar de que o aplicativo Silverlight tem foco.
Eu também corri para este problema, mas tinha surgido a partir de um caso diferente do que o que foi respondida aqui já.
Se você tem um controle BusyIndicator
sendo exibido e ocultado durante todo o seu ponto de vista, os controles não terá foco, se você tem linhas como
Dispatcher.BeginInvoke(() => { myControl.Focus();});
no evento de carregamento.
Em vez disso, você vai precisar ligar para essa linha de código após sua exibição BusyIndicator foi definida como falsa.
Eu tenho uma pergunta relacionada aqui , bem como uma solução para este cenário.
Na verdade um beheviour irritante. Eu encontrei uma solução simples e direta:
(código VB)
Me.Focus()
Me.UpdateLayout()
Me.tbx_user_num.Focus()
Me.tbx_user_num.UpdateLayout()
Cada elemento aqui é essencial, como por meu projecto, pelo menos (VB2010 SL4 OutOfBrowser).
Crédito para: http: // www .dotnetspark.com / kb / 1792-set-focus-a-caixa de texto-silverlight-3.aspx
Nenhuma das respostas acima funcionou para mim diretamente, o que eu fiz é que eu adicionei este evento em no construtor MainPage ():
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
E lidou com isso da seguinte forma:
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
System.Windows.Browser.HtmlPage.Plugin.Focus();
RegularTextBox.Focus();
}
Versão Meu Silverlight é 4.