我在使用行为方面不是很有经验,但到目前为止它们已经派上用场,可以从ViewModel
执行代码,但仍会触发View
的操作。
在我目前的情况下,点击TextBox
时会显示Button
。我想在单击TextBox
之后设置Button
的焦点。
以前,我可以使用EventTriggerBehavior
设置焦点,如下所示:
<core:EventTriggerBehavior>
<behaviors:FocusAction />
</core:EventTriggerBehavior>
但是,如果我想在加载View
时设置该控件的焦点,这就足够了。在这种情况下,TextBox
当时不可见,实际上,焦点最初会转到不同的TextBox
。
有没有办法从ViewModel
设置控件的焦点?这是一个WinRT 8.1应用程序,但将来会被移植到Windows 10 Universal。
修改
答案here看起来会像我要找的那样,但是当我尝试它时,我得到一个错误:
无法解析符号&#39; UIPropertyMetadata&#39;
据我所知,System.Windows
命名空间中存在class,但即使使用using System.Windows;
,我仍会遇到相同的错误。我也尝试了new System.Windows.UIPropertyMetadata(null, ElementToFocusPropertyChanged)
,但这也没有什么作用。该类在WinRT中不可用吗?
答案 0 :(得分:0)
我能够通过稍微修改原始问题中链接的答案来使其工作。对于希望在WinRT应用程序中完成此任务的任何人,这里是修改后的代码:
public class EventFocusAttachment
{
public static Control GetElementToFocus(Button button)
{
return (Control)button.GetValue(ElementToFocusProperty);
}
public static void SetElementToFocus(Button button, Control value)
{
button.SetValue(ElementToFocusProperty, value);
}
public static readonly DependencyProperty ElementToFocusProperty =
DependencyProperty.RegisterAttached("ElementToFocus", typeof(Control),
typeof(EventFocusAttachment), new PropertyMetadata(null, ElementToFocusPropertyChanged));
public static void ElementToFocusPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
var button = sender as Button;
if (button != null)
{
button.Click += async (s, args) =>
{
var control = GetElementToFocus(button);
if (control != null)
{
await Task.Delay(100);
control.Focus(FocusState.Programmatic);
}
};
}
}
}
我不得不添加一个小延迟,因为我按下的TextBox
直到按下按钮后才能看到,所以它没有延迟工作。另外,我必须将UIPropertyMetadata
更改为PropertyMetadata
,并将async
添加到lambda表达式以允许await Task.Delay(100);