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();
}
}
}
私はこれを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();
}
Plugin.Focus();
うまくいきませんでした。
呼び出す
Dispatcher.BeginInvoke(() => { tbNewText.Focus();});
Loadイベントから動作しました。
サンティアゴパラディーノディスパッチャーは完璧に機能しました。私がしていることは:
this.Focus();次にDispatcher.BeginInvoke(()=> {tbNewText.Focus();});
私はコントロールコンストラクタを入れることを解決しました:
this.TargetTextBox.Loaded += (o, e) => { this.TargetTextBox.Focus(); };
本当に集中していないと思いますか? Beta 2には既知のバグがあり、フォーカスを取得して入力することはできますが、キャレットやボーダーを取得できません。回避策は、Focus()を呼び出す直前にテキストボックスでUpdateLayout()を呼び出すことです。
コントロール全体が読み込まれてから数ミリ秒後にFocusメソッドを実行するUserLoadedイベントにDispatcherTimerを追加してみます。多分問題があります。
私も呼び出す必要がありました
Deployment.Current.Dispatcher.BeginInvoke(()=> myTextbox.Focus());
興味深いことに、この呼び出しは、TextBlockをマウスクリックしてTextBlockを折りたたみ、TextBoxを表示すると、イベントハンドラー内で発生します。 dispatcher.BeginInvokeがフォローしないと、フォーカスされません。
-マイク
ブラウザ外のアプリの場合、System.Windows.Browser.HtmlPage.Plugin.Focus();
は存在しません。
他のアイデアについては 私の質問はこちら を参照してください。
同じコードを呼び出すボタンを追加すると完全に機能するため、フォーカスを設定するコードは正しいです。
<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">
私にはバグのようです...
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つ忘れていました...ページ上のSilverlightアプリケーションに確実にフォーカスを強制する方法が見つかりませんでした(一部のブラウザーでは機能し、他のブラウザーでは機能しません)。
したがって、Silverlightアプリ自体にフォーカスがない可能性があります。私は通常、キーボード入力を期待し始める前に、ユーザーをだましてボタンや同様のものをクリックさせ、Silverlightアプリにフォーカスがあることを確認します。
確かに迷惑な行動。私はシンプルで簡単な解決策を見つけました:
(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
私もこの問題に遭遇しましたが、すでにここで回答されているのとは別のケースから生じていました。
ビュー中にBusyIndicator
コントロールが表示されたり非表示になったりした場合、次のような行があるとコントロールにフォーカスが移りません。
Dispatcher.BeginInvoke(() => { myControl.Focus();});
読み込みイベントで。
代わりに、そのコード行を呼び出す必要がありますafter BusyIndicatorの表示が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です。