2010-10-19 20 views
5

Sekme kontrolüm ve birkaç sekme öğem var. SelectionChanged olayını başarıyla dinliyorum ve ilgilendiğim sekmenin seçili olanın olup olmadığını kontrol ediyorum.WPF TabControl On SelectionChanged, odağı bir metin alanına ayarla

Bu kodu (aşağıda) kullanılarak ve ayıklayıcıya yoluyla kaldığımı, benim dallanma mantığı tasarlandığı gibi çalıştığını görebilirsiniz; Ancak, sahip olduğum sorun şu ki, bu çağrıyı txt.Focus() numaralı telefona geçersiz kılıyor çünkü doğru sekme öğesi görüntülendikten sonra, odak metin kutusunda değil. Ben sadece bir düğme olay işleyicisi içinde txtusr.Focus() koyarsanız

private void tabMain_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    // exact same behavior with and without this line 
    e.Handled = true; 

    if (e.AddedItems.Contains(usrTab)) 
    { 
     txtusr.Focus(); 
    } 
    else if (e.AddedItems.Contains(svcTab)) 
    { 
     txtsvc.Focus(); 
    } 
} 

, ben beklediğiniz gibi tam odaklanır.

Bunun, .Focus() yönteminin çağrıldığı anda yüklenmeyen tabitem içeriğiyle ilgili olduğundan şüpheleniyorum, ancak nasıl düzelteceğimi bilmiyorum. .Focus() koyarak

+0

Yeniden üretilip üretilemeyeceğini görmek için bu sorunu harici kodunuzdan yalıtdınız mı? Eğer öyleyse, bir zamanlama/çerçeve sorunu ve daha sonra eldeki bu bilgi ile problemi biraz farklı bir şekilde ele alabilirsiniz. –

+0

Ben inconsistantly bir taslaktır-programında bu çoğaltmak başardı. – Nate

cevap

10

deneyin bir Dispatcher.BeginInvoke içine çağırır.

Dispatcher.BeginInvoke(new Action(() => { txtsvc.Focus(); })); 
+0

Bir iş parçacığı istisnası almıyordum, ancak bu sorunu çözdü. Teşekkürler. – Nate

+2

Yah, bu durumda gerçekten konuyla ilgili değil. Bazı denetimler dahili olarak Dispatcher.Invoke/BeginInvoke kullanır. o (sürece senin görevin diğer her şey eşit veya daha düşük önceliğe sahip olduğu gibi) bitirmek için önce Dispatcher sıranın sonuna görevinizi ekleyerek, her şeyi verir. En azından benim anlayışım bu. – mdm20

İlgili konular