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();
        }
    }
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top