web-dev-qa-db-ja.com

Silverlightでテキストボックスにフォーカスを与えるにはどうすればよいですか?

Silverlightアプリケーションでは、TextBoxコントロールにフォーカスを移すことができないようです。さまざまな投稿の推奨事項で、IsTabStopプロパティをTrueに設定し、TextBox.Focus()を使用しています。 UserControl_Loadedイベントが発生していますが、TextBoxコントロールはフォーカスされていません。以下に非常に単純なコードを含めました。何が欠けていますか?ありがとう。

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();
        }
    }
}
32
Ben Griswold

私はこれをsilverlight.netで見つけ、RegularTextBox.Focus()を呼び出す前にSystem.Windows.Browser.HtmlPage.Plugin.Focus()への呼び出しを追加することで機能させることができました。

   private void UserControl_Loaded(object sender, RoutedEventArgs e)
   {        
      System.Windows.Browser.HtmlPage.Plugin.Focus();
      RegularTextBox.Focus();
   }
41
Jim B-G
Plugin.Focus(); 

うまくいきませんでした。

呼び出す

 Dispatcher.BeginInvoke(() => { tbNewText.Focus();});

Loadイベントから動作しました。

23
rekle

サンティアゴパラディーノディスパッチャーは完璧に機能しました。私がしていることは:

this.Focus();次にDispatcher.BeginInvoke(()=> {tbNewText.Focus();});

10
om.

私はコントロールコンストラクタを入れることを解決しました:

this.TargetTextBox.Loaded += (o, e) => { this.TargetTextBox.Focus(); };
3
Luca

本当に集中していないと思いますか? Beta 2には既知のバグがあり、フォーカスを取得して入力することはできますが、キャレットやボーダーを取得できません。回避策は、Focus()を呼び出す直前にテキストボックスでUpdateLayout()を呼び出すことです。

2
Bill Reiss

コントロール全体が読み込まれてから数ミリ秒後にFocusメソッドを実行するUserLoadedイベントにDispatcherTimerを追加してみます。多分問題があります。

2

私も呼び出す必要がありました

Deployment.Current.Dispatcher.BeginInvoke(()=> myTextbox.Focus());

興味深いことに、この呼び出しは、TextBlockをマウスクリックしてTextBlockを折りたたみ、TextBoxを表示すると、イベントハンドラー内で発生します。 dispatcher.BeginInvokeがフォローしないと、フォーカスされません。

-マイク

2
mike gold

ブラウザ外のアプリの場合、System.Windows.Browser.HtmlPage.Plugin.Focus();は存在しません。

他のアイデアについては 私の質問はこちら を参照してください。

1
Simon_Weaver

同じコードを呼び出すボタンを追加すると完全に機能するため、フォーカスを設定するコードは正しいです。

<StackPanel Width="150" VerticalAlignment="Center">
    <TextBox x:Name="RegularTextBox" IsTabStop="True" />
    <Button Click="UserControl_Loaded">
        <TextBlock Text="Test"/>
    </Button>
</StackPanel>

したがって、これはFocus()と何らかの関係があり、何らかのユーザー操作が必要であると想定しています。 UserControlのMouseMoveイベントで動作させることはできませんでしたが、KeyDownイベントを配置してフォーカスを設定しました(ただし、テンプレートはフォーカスされたテンプレートに更新されません)。

Width="400" Height="300" Loaded="UserControl_Loaded" KeyDown="UserControl_KeyDown">

私にはバグのようです...

1
Bryant

私のプロフィールは@Jim B-Gの answer にコメントするには不十分ですが、私にとってうまくいったのは、RichTextBoxにLoadedイベントのハンドラーを追加し、そのハンドラー内に追加することでした。

System.Windows.Browser.HtmlPage.Plugin.Focus();
<YourTextBox>.UpdateLayout()
<YourTextBox>.Focus();

ただし、IEおよびFFでのみ機能しました。ChromeおよびSafariで機能させるには、 this の下部までスクロールします

1
harryhazza

SL4、IE7、Firefox 3.6.12で動作します

(私にとって)フォーカスを機能させる最後の欠落した「ピース」は.TabIndexプロパティを設定することでした

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

私は1つ忘れていました...ページ上のSilverlightアプリケーションに確実にフォーカスを強制する方法が見つかりませんでした(一部のブラウザーでは機能し、他のブラウザーでは機能しません)。

したがって、Silverlightアプリ自体にフォーカスがない可能性があります。私は通常、キーボード入力を期待し始める前に、ユーザーをだましてボタンや同様のものをクリックさせ、Silverlightアプリにフォーカスがあることを確認します。

0
Bill Reiss

確かに迷惑な行動。私はシンプルで簡単な解決策を見つけました:

(VBコード)

    Me.Focus()
    Me.UpdateLayout()

    Me.tbx_user_num.Focus()
    Me.tbx_user_num.UpdateLayout()

ここの各要素は、少なくとも私のプロジェクト(VB2010 SL4 OutOfBrowser)のように不可欠です。

クレジット: http://www.dotnetspark.com/kb/1792-set-focus-to-textbox-silverlight-3.aspx

0
Jonathan S.

私もこの問題に遭遇しましたが、すでにここで回答されているのとは別のケースから生じていました。

ビュー中にBusyIndicatorコントロールが表示されたり非表示になったりした場合、次のような行があるとコントロールにフォーカスが移りません。

Dispatcher.BeginInvoke(() => { myControl.Focus();}); 

読み込みイベントで。

代わりに、そのコード行を呼び出す必要がありますafter BusyIndi​​catorの表示がfalseに設定されています。

関連する質問 here と、このシナリオの解決策があります。

上記の答えのどれも直接私のために機能しませんでした、私がしたことは、このイベントをMainPage()コンストラクターに追加したことです:

this.Loaded += new RoutedEventHandler(MainPage_Loaded);

そしてそれを次のように処理しました:

   void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        System.Windows.Browser.HtmlPage.Plugin.Focus();
        RegularTextBox.Focus();
    }

Silverlightのバージョンは4です。

0
Talha Imam