2016-03-21 3 views
0

ビヘイビアの使用経験はあまりありませんが、ViewModelのコードを実行できるようになっていますが、まだViewのアクションがトリガされています。ボタンのFocusAction動作をバインドする

私の現在のシナリオでは、Buttonがクリックされたときに表示されるTextBoxがあります。私はそれからTextBoxの後にButtonをクリックした後にフォーカスを設定したいと思います。

以前、私はそうのようなEventTriggerBehaviorを使用してフォーカスを設定することができました:

<core:EventTriggerBehavior> 
    <behaviors:FocusAction /> 
</core:EventTriggerBehavior> 

私はViewがロードされたときにそのコントロールのフォーカスを設定したい場合は、これが唯一の十分です。この場合、TextBoxはその時点では表示されず、実際にはフォーカスは最初は別のTextBoxになります。

ViewModelからコントロールのフォーカスを設定する方法はありますか?これはWinRT 8.1アプリケーションですが、今後Windows 10 Universalに移植される予定です。それは私が探しています何だろうよう

EDIT

は答えhereに見えますが、私はそれをしようとすると、私はエラーを取得:私は、それを伝えることができるものから

Cannot resolve symbol 'UIPropertyMetadata'

classSystem.Windows名前空間に存在しますが、using System.Windows;であっても、同じエラーが発生します。私もnew System.Windows.UIPropertyMetadata(null, ElementToFocusPropertyChanged)を試してみましたが、それでは違いはありません。そのクラスはWinRTで利用できませんか?

答えて

0

私の元の質問にリンクされている回答を少し修正することで、それを動作させることができました。そう、

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が表示されていないので、小さな遅延を追加する必要がありました:WinRTのアプリケーションでこれを達成するためにお探しの方のために、ここで変更されたコードですそれは遅れなく働いていなかった。また、UIPropertyMetadataを単にPropertyMetadataに変更し、ラムダ式にasyncを追加して、await Task.Delay(100);

関連する問題