我在Silverlight 4(测试版)中有一个简单的ChildWindow
弹出窗口。
重要提示:这是浏览器外应用程序。
我希望在窗口打开时自动将焦点放在TextBox
控件上。
我尝试了几件事:
以下代码似乎没有做任何事情。在“加载”之后我不认为控件已经准备好了。
private void ChildWindow_Loaded(object sender, RoutedEventArgs e)
{
textBox1.Focus();
}
这很有效,但它很笨拙。
private void ChildWindow_GotFocus(object sender, RoutedEventArgs e)
{
if (_firstTime == true) {
textBox1.Focus();
_firstTime = false;
}
}
有没有更好的方法?我总是不得不在WinForms中做这样可怕的事情,但希望不再需要这样做。
注意:此similar question仅适用于浏览器。它建议调用System.Windows.Browser.HtmlPage.Plugin.Focus();
哪个不起作用,实际上在浏览器上运行Silverlight 4 beta时会出错。
答案 0 :(得分:3)
我在SilverLight 4(OOB)中遇到了同样的问题,我注意到标签序列会将焦点设置为我看不到的控件。似乎正在发生的事情是焦点被设置为您的控件(选项卡序列中的第一个)然后由于某种原因焦点移动到ContentControl(name =“content”),其中(我认为)是父的孩子的窗户。
默认情况下,ContentControl的IsTabStop = true。 看到.... Why would I want IsTabStop set to true on a ContentControl? 要为应用中的所有ContentControl设置ContentControl.IsTabStop = false,请将其添加到styles.xaml。
<Style TargetType="ContentControl" >
<Setter Property="IsTabStop" Value="false"/>
</Style>
MainPage上的选项卡序列也会出现同样的问题。这种风格也可以解决这个问题。
答案 1 :(得分:2)
你走在正确的轨道上。您需要处理两个测试用例:
1.在浏览器中设置焦点。
2.将焦点设置在浏览器之外。
您在Loaded事件中显示的代码将在浏览器中完美运行。所有必要的是重构它来处理这两种情况:
private void ChildWindow_Loaded(object sender, RoutedEventArgs e)
{
if (App.current.IsRunningOutOfBrowser)
{
textBox1.Focus();
}
else
{
System.Windows.Browser.HtmlPage.Plugin.Focus();
textBox1.Focus();
}
}
这应该适合你。
答案 2 :(得分:2)
感谢所有帖子,但经过一些研究后,下面的内容对我有用
在Xamal:
<TextBox VerticalAlignment="Center" HorizontalAlignment="Left" FontFamily="Arial" FontSize="12" Height="25" Width="200" Margin="38,50,0,0" Name="txtUserName" Text="{Binding LoginInfo.UserName,Mode=TwoWay, NotifyOnValidationError=True}" IsTabStop="True" TabIndex="1" ></TextBox>
// Initialiazing Main Part View Model
/// </summary>
/// <param name="mainPartViewModel"></param>
public ChildWindowLoginControl(MainPartViewModel mainPartViewModel)
{
InitializeComponent();
this.DataContext = mainPartViewModel;
System.Windows.Browser.HtmlPage.Plugin.Focus();
this.GotFocus += (s, e) => { txtUserName.Focus(); };
}
答案 3 :(得分:1)
当我想在GotFocus
中设置焦点时,我必须使用您的ChildWindow
方式编写在IronPython中编写的Silverlight 3应用程序。
答案 4 :(得分:1)
我用:
protected override void OnOpened()
{
base.OnOpened();
textBox1.Focus();
}
答案 5 :(得分:0)
感谢所有帖子,但我发现通过以下方式完成了工作。
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
if (App.Current.IsRunningOutOfBrowser)
{
txtSalesOrderNo.Focus();
}
else
{
System.Windows.Browser.HtmlPage.Plugin.Focus();
txtSalesOrderNo.Focus();
}
}