2010-02-17 10 views
6

Genellikle Yüklü olay işleyicisinde myControl.Focus() numaralı telefonu arıyorum, ancak bu, özel nesneler listesine veri olan ListBox için işe yaramaz. Uygulamama başladığımda, ListBox'un ilk öğesi seçildi, ancak odak başka bir yerde. Veritabanını kullanıyorsa, odağı bir Yükleyiciye doğru olarak nasıl yükleyebilirim?

Ben odak ayarlanırken, çünkü veri sınırlama öğeleri içine yüklenmeden önce bu olabileceğini düşündüm ... ama şu kod ctrlItemsCount numarasını 8.

gösterdiğinden nasıl olabilir gerçekten öğesinin olmadığını göstermektedir Bu durumda ilk odağı ayarlayın ve başlangıçtaki odağı ayarlamak için doğru yer hangisidir?

private void onLoad(object sender, RoutedEventArgs e) { 
     if (ctrlCountries.Items.Count > 0) { 
      ctrlItemsCount.Text = ctrlCountries.Items.Count; 
      ctrlCountries.SelectedIndex = 0; 
      FocusManager.SetFocusedElement(this, ctrlCountries); 
     } 

    } 

DÜZENLEME: gerçek ListBox kendisi için yüklenen olaya bu kodu taşımış. Neredeyse işe yarıyor - odak şimdi ListBox üzerinde, ancak hala madde # 0 klavye imleci var önce bir kez AŞAĞI tuşuna basmaya ihtiyacım var. Bir başka deyişle, odak veya imleç olarak, nedense 1 çentik yukarıdaki madde # 0:

private void onCountriesLoaded(object sender, RoutedEventArgs e) { 
    ctrlCountries.SelectedIndex = 0; 
    FocusManager.SetFocusedElement(this, ctrlCountries); 
    Keyboard.Focus(); 
} 

cevap

10

İlk öğeyi liste kutusuna odaklamak isterseniz, odağı ilk ListBoxItem kapsayıcısına ayarlamanız gerekir. Örneğin:

if (myListBox.Items.Count > 0) 
{ 
    ListBoxItem item = (ListBoxItem)myListBox.ItemContainerGenerator.ContainerFromIndex(0); 
    FocusManager.SetFocusedElement(this /* focus scope region */, item); 
} 

Hala ListBox kontrolü ilk olarak Loaded olayı aldığını olsa emin olmalıyız. Liste kutusu ile ilgili güncellemeleri işlemek için yararlı olan bir dizi başka etkinlik var. MSDN'de ItemContainerGenerator'a bir göz atın.

+1

Çalışıyor! Neredeyse ... "Keyboard.Focus (item); kullanırsam, gerektiği gibi% 100 çalışır." FocusManager yerine. Bu garip çünkü MSDN, FocusManager'ın mantıksal odağı ayarlayacağını ve klavye odağını ayarlamaya çalışacağını söylüyor. Keyboard.Focus'un (item) her zaman kullanmam gereken doğru dersi öğreniyor muyum? –

2

FocusManager.SetFocusedElement yöntem mantıksal odak değil, klavye odağı verir. Bir öğeye klavye odağı vermek için Keyboard.Focus yöntemini kullanabilirsiniz. WPF'deki odak yönetimi hakkında daha fazla ayrıntı için this page'a bakın.

+0

Keyboard.Focus (ctrlCountries); ve işe yaramıyor. Odaklama yöneticisine yalnızca odağı ayarlayan bir düğme tıklama olay işleyicisini eklerseniz işe yarar. –

+1

Başka bir deyişle, aşağıdaki kod, liste kutusu ilk öğesinin üzerine odaklanmaz: özel void onLoad (nesne gönderen, RoutedEventArgs e) { FocusManager.SetFocusedElement (this, ctrlCountries); Keyboard.Focus (ctrlCountries); } –

+1

ListBox tamamen yüklendikten sonra yapın (yani, ctrlCountries.Loaded olayı oluştuğunda) –

İlgili konular