2010-11-21 8 views
3

WP7 uygulamam için, pivotitem'in başlık şablonuna yerleştirdiğim bir tarih denetimi bulmam gerekiyor. Seçili olan PivotItem için bu tarih seçici kontrolüne arkadaki kodda nasıl erişirim?WP7 pivotitem'in iç denetimini bulun

public static T FindName<T>(string name, DependencyObject reference) where T : FrameworkElement 
{ 
    if (string.IsNullOrEmpty(name)) 
    { 
     throw new ArgumentNullException("name"); 
    } 

    if (reference == null) 
    { 
     throw new ArgumentNullException("reference"); 
    } 

    return FindNameInternal<T>(name, reference); 
} 

private static T FindNameInternal<T>(string name, DependencyObject reference) where T : FrameworkElement 
{ 
    foreach (DependencyObject obj in GetChildren(reference)) 
    { 
     T elem = obj as T; 

     if (elem != null && elem.Name == name) 
     { 
      return elem; 
     } 

     elem = FindNameInternal<T>(name, obj); 

     if (elem != null) 
     { 
      return elem; 
     } 
     else 
     { 
      //if (obj.GetType().FullName == "System.Windows.Controls.DataField") 
      // elem = (obj as DataField).Content as T; 

      if (elem != null && elem.Name == name) 
       return elem; 
     } 
    } 
    return null; 
} 

private static IEnumerable<DependencyObject> GetChildren(DependencyObject reference) 
{ 
    int childCount = VisualTreeHelper.GetChildrenCount(reference); 

    if (childCount > 0) 
    { 
     for (int i = 0; i < childCount; i++) 
     { 
      yield return VisualTreeHelper.GetChild(reference, i); 
     } 
    } 
} 

cevap

1

Bunun için gerçekten iyi bir çözüm bilmiyorum. İlk düşüncem, DatePicker nesnesine neden bir başvuru yapmanız gerektiğine inanıyorum. Ama sanırım senin sebeplerin var. gerçi

Muhtemel bir çözüm: Doğru tipte (DatePicker) bir nesne bulduğunda
Sen pivot öğesinden görsel ağaç travers ve durdurmak için VisualTreeHelper kullanabilirsiniz. Böyle bir yardımcı işlevi oluşturun:

private static DependencyObject GetDependencyObjectFromVisualTree(DependencyObject startObject, Type type) 
{ 
    DependencyObject parent = startObject; 

    while (parent != null) 
    { 
     if (type.IsInstanceOfType(parent)) 
      break; 

     parent = VisualTreeHelper.GetParent(parent); 
    } 

    return parent; 
} 

Sonra türü olarak DependencyObject typeof (DatePicker) olarak PivotItem ile diyoruz ve son olarak bir DatePicker döndü DependencyObject attı.

HTH

+0

devcube, lütfen sorudaki güncellenmiş örneğime bakın. Tarih seçicisini bulmak için bu kodu kullanıyorum ama her zaman böyle bir şey kullanarak arama yaptığımda, seçilen PivotItem'i değil, ilk pivotitem'den tarihçiyi alır: RadDatePicker radDatePicker = VisualElementHelper.FindName ("radDatePicker", bu); –

+0

Kullanıyorsam - RadDatePicker radDatePicker = VisualElementHelper.FindName ("radDatePicker", CurrentPivotItem); CurrentPivotItem, PivotControl'ün SelectedItem'i olarak ayarlandığında, boş bir başvuru döndürülür. :( –

1

düzenli Veli/Çocuk ilişki aslında Pivot kontrolü için çalışmaz. Ne yapabilirsiniz doğrudan PivotItem içinde DatePicked bileşeni için aramasıdır:

((DatePicker)((PivotItem)MainPivot.SelectedItem).FindName("DateControl")) 

MainPivot Pivot kontrolüdür. Seçili olan öğeyi SelectedItem üzerinden alıyorum - aksi halde nesnesini aldığım için doğrudan PivotItem'a gönderdiğimi fark ettim. Ardından, bir x: Name için ayarlanmış olması koşuluyla, DateControl adlı bir denetim arıyorum.

Bundan sonra yapılması gerekenler, nesneyi DatePicker'a aktarır ve özelliklerini diğer herhangi bir denetim için yapacağınız şekilde kullanır.