2010-02-18 17 views
27

FindName benim için kırık gerektiği halde :(böyle şeylere bir uzman isenizWPF - bu

biraz yardıma isterdim FindName boş sonucunu döndürür

aradığım nesne yoktur.. Ben kanıtı İşte

senaryodur.

ToggleButton button = (ToggleButton)sender; 
Popup popup = (Popup)button.FindName("popSelectIteration"); 

popup boş ama her zaman sadece bazen ama ben looki duyuyorum çocuğu null ayarlandığında bile.. ng var.

Null olduğunda bir ara verdim ve bu iki ekran görüntüsünü yakaladım.

alt text http://img175.imageshack.us/img175/2055/popupisnull.png

Ama saatin içine kazmak eğer, gördüğünüz çocuk olduğunu:

alt text http://img708.imageshack.us/img708/8757/watchwithpopupnull.png

FindName "popSelectIteration" için boş dönen nerede

olduğunu Yani neyi özlüyorum? FindName neden bulamıyor? Ekran görüntüsünden gördüğünüz gibi bu bir zamanlama sorunu değildir (FindName saati boştur, ancak doğrudan yol iyidir).

Bir denetim bulmanın daha iyi bir yolu var mı?

Yan Not: Söz konusu açma/kapama düğmesi için XAML'de iç içe geçiyorsanız, bu soruda bulunabilir: WPF - FrameworkElement - Enumerate all decendents?.


Güncelleme: Ben bu işe yarıyor bazı zamanları ve diğer kez başarısız nedenini görmek için kazma bazı yaptı. NameScope.SetNameScope((DependencyObject)form, new NameScope()); (Tam yöntem kodu here) çağıran bir animasyon var. Bunun hemen ardından FindName başarısız olmaya başlar.

Bu çağrıyı gerçekten anlamıyorum. Sanırım kodu kopyalayıp yapıştırdım. Her neyse, yorumladım. Ama bunun neden başarısız olduğunu bilmek isterim.

cevap

30

Görsel ve mantıksal ağaç arasındaki farkla ilgili olması gerektiğini tahmin ediyorum. Denetim mantıksal ağaçtadır, ancak bu denetimin şablonu henüz uygulanmamıştır ve bu nedenle FindName yararlı bir şey döndürmeyecektir.

ApplyTemplate(); önce kapta.

Bu, bazen neden bir şeyler döndürdüğünü de açıklar.

+0

Benim için çalıştı. Template.FindName() – Trap

+0

ile bu sorunu yaşıyordu Bu benim için çalıştı, başlangıçta veya başlangıçta görünmeyen bir sekmede gizlenmiş olan denetimler için daha fazla bir sorun oldu. – Dave

+0

Bir ComboBox ile GetTemplateChild ("PART_EditableTextBox") ile bir sorun yaşıyordum. Sorunu çözmeden önce ApplyTemplate() öğesini çağırmak. Teşekkürler! –

1

Bazı denetim için DataTemplate uygulamasında bir şey bulmaya çalıştığınızda, özellikle benim deneyimime dayanarak FindName işlevini kullanmaktan kaçınmanızı öneririm. Bunun yerine, (yazılım mimarinize bağlı olarak), XAML'de Popup ve belirtin, buna benzer bir kaynak yazın veya bazı Model özelliğini referans olarak ayarlamak için Bağlama özelliğini kullanın. İyi şanslar.

28

şimdi aynı soruyu karşılamak zorunda, ama yöntemi, aşağıdaki gibi kullanmak button.FindResource("popSelectIteration")

+1

Sadece bana oluyor! 2 saat harcadım, sonunda yöntemini ve çalışmayı deniyorum! – Cheung

-1

deneyin deneyin: Denetim dinamik ise

#region Override - OnApplyTemplate 

    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 

     this.PART_ListViewLeft  = GetTemplateChild(cPART_ListViewLeft)  as ListView; 
     this.PART_ListViewCenter = GetTemplateChild(cPART_ListViewCenter) as ListView; 
     this.PART_ListViewRight  = GetTemplateChild(cPART_ListViewRight)  as ListView; 

     this.PART_GridViewLeft  = GetTemplateChild(cPART_GridViewLeft)  as DsxGridView; 
     this.PART_GridViewCenter = GetTemplateChild(cPART_GridViewCenter) as DsxGridView; 
     this.PART_GridViewRight  = GetTemplateChild(cPART_GridViewRight)  as DsxGridView; 
     if(this.PART_ListViewLeft!=null) 
      this.PART_ListViewLeft  .AlternationCount = this.AlternatingRowBrushes.Count; 
     if(this.PART_ListViewCenter!=null) 
      this.PART_ListViewCenter .AlternationCount = this.AlternatingRowBrushes.Count; 
     if(this.PART_ListViewRight!=null) 
      this.PART_ListViewRight  .AlternationCount = this.AlternatingRowBrushes.Count; 
     // ApplyTempleted = true; 
     CreateColumnLayout(); 
    } 
    #endregion 

oluşturmak ve hangi veya kapsayıcı "Görünürlük", gizlenecek veya daraltılmış olarak ayarlanmışsa, bu kod "this.PART_ListViewLeft = GetTemplateChild (cPART_ListViewLeft) ListView olarak;" her zaman null döner, nedeni açıkça: datatemplete henüz OnApplyTemplate çağrılmadan önce uygulanmadı !!!!!!! sorunuzu aynı olmalı! iyi şanslar!

1

kullanmak

LogicalTreeHelper.FindLogicalNode(button, "popSelectIteration"); 
5

Benim durumumda, kod arkasıyla öğeleri eklediğinizde bu olur. İsim kapsamları üzerinden FindName() (veya animasyon çerçevesini) kandırabileceğinizi keşfettim. İleride başvurmak için bu Gönderme

NameScope.GetNameScope(yourContainer).UnregisterName("name of your control"); 

: Yani kontrolünüzü oluşturduğunuzda, gerçi, size isim kaydını emin olmalısınız, güvenilir Bunun çalışabilmesi için

NameScope.GetNameScope(yourContainer).RegisterName("name of your control", yourControlInstance); 

yapman.