在按钮上绑定FocusAction行为单击

时间:2016-03-21 07:22:46

标签: c# mvvm winrt-xaml

我在使用行为方面不是很有经验,但到目前为止它们已经派上用场,可以从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中不可用吗?

1 个答案:

答案 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);