2016-03-21 30 views
0

'u tıklatın. Davranışlar kullanarak çok deneyimli değilim, ancak şu ana kadar ViewModel kodunu yürütmek için hala kullanışlı oldular, ancak yine de eylemleri View'dan başlatıyorlar.Binding FocusAction Davranış Düğme

Şu anki senaryomda, Button tıklandığında görüntülenen bir TextBox var.Button tıklandıktan sonra o TextBoxodağını ayarlamak istiyorum.

Daha önce ben bir EventTriggerBehavior şöyle kullanarak odaklamayı ayarlamak mümkün olmuştur: Ben View yüklendiğinde o denetimin odağı ayarlamak isterseniz

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

Ancak bu sadece yeterli olacaktır. Bu durumda, TextBox o anda görünmüyor ve aslında, başlangıçta başlangıçta farklı bir TextBox gider.

Denetimin odağını ViewModel'dan ayarlama yolu var mı? Bu bir WinRT 8.1 uygulamasıdır, ancak gelecekte Windows 10 Universal'a taşınacaktır.

DÜZENLEME

ben arıyorum ne olur gibi cevap here görünüyor, ama bunu çalıştığımda bir hata alıyorum:

anlarım kadarıyla

Cannot resolve symbol 'UIPropertyMetadata'

, class o System.Windows ad alanında bulunur, ancak using System.Windows; ile bile aynı hatayı alıyorum. Ayrıca new System.Windows.UIPropertyMetadata(null, ElementToFocusPropertyChanged)'u da denedim, ancak bu da bir fark yaratmıyor. Bu sınıf WinRT'de mevcut değil mi?

cevap

0

Asıl soruma bağlı olan cevabı biraz değiştirerek işe yaratabildim. böylece,

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); 
       } 
      }; 
     } 
    } 
} 

Ben düğmeye basıldıktan sonra kadar odaklanıyorum TextBox görünür olmadığından küçük bir gecikme eklemek zorunda: Bir WinRT uygulamasında Bunu gerçekleştirmek için arayan herkes için buraya modifiye kodudur gecikme olmadan çalışıyordu. Ayrıca, 'u yalnızca PropertyMetadata olarak değiştirmek zorunda kaldım ve

için izin vermek üzere lambda ifadesine async ekleyin.