2016-06-23 122 views
1

我們有一個Windows手機應用程序,我們在Page.Resource裏面有DataTemplate。下面是xaml:如何找到內部頁面資源的子控件?

<PhoneApplicationPage 
<PhoneApplicationPage.Resources> 
<DataTemplate> 
<ScrollViewer> // We want to fetch this control inside DataTemplate 
.. 
</ScrollViewer> 
</DataTemplate> 
</PhoneApplicationPage.Resources> 

<Grid Name="LayoutRoot"> 
<ItemsControl ItemTemplate={StatisSource DataTemplate}> 
</ItemsControl> 
</Grid> 

</PhoneApplicationPage 

到目前爲止,我們已經使用了可視化樹幫助程序,並在其中查找子控件。下面是我們所使用的輔助代碼段:

public T FindChild<T>(DependencyObject parent, string childName) 
where T : DependencyObject 
    { 
     // Confirm parent and childName are valid. 
     if (parent == null) return null; 

     T foundChild = null; 

     int childrenCount = VisualTreeHelper.GetChildrenCount(parent); 
     for (int i = 0; i < childrenCount; i++) 
     { 
      var child = VisualTreeHelper.GetChild(parent, i); 
      // If the child is not of the request child type child 
      T childType = child as T; 
      if (childType == null) 
      { 
       // recursively drill down the tree 
       foundChild = FindChild<T>(child, childName); 

       // If the child is found, break so we do not overwrite the found child. 
       if (foundChild != null) break; 
      } 
      else if (!string.IsNullOrEmpty(childName)) 
      { 
       var frameworkElement = child as FrameworkElement; 
       // If the child's name is set for search 
       if (frameworkElement != null && frameworkElement.Name == childName) 
       { 
        // if the child's name is of the request name 
        foundChild = (T)child; 
        break; 
       } 
      } 
      else 
      { 
       // child element found. 
       foundChild = (T)child; 
       break; 
      } 
     } 

     return foundChild; 
    } 

,並調用上面的函數爲:

   ScrollViewer scrollViewer = FindChild<ScrollViewer>((this.View.FindName("AdSlider") as ItemsControl) ,"scrollViewer") as ScrollViewer; 

不過的ScrollViewer對象總是空值。我們無法在datatemplate中獲取預期的控件。任何建議?

謝謝。

回答

0

1,不要給你的函數提供控制名稱

變化:

ScrollViewer scrollViewer = FindChild<ScrollViewer>((this.View.FindName("AdSlider") as ItemsControl) ,"scrollViewer") as ScrollViewer; 

我沒有看到你的樣品在名爲AdSlider任何控制。

分爲:

ScrollViewer scrollViewer = FindChild<ScrollViewer>((this.View.FindName("AdSlider") as ItemsControl) , null); 

2到您的DataTemplate提供一個名稱

變化:

<DataTemplate> 

分爲:

<DataTemplate x:Key="dataTemplate1"> 

3還請正確

<ItemsControl ItemTemplate={StatisSource dataTemplate1}> 

到:

<ItemsControl ItemTemplate={StaticSource dataTemplate1}> 
+0

感謝您的反饋都靈。但在完成所有建議之後,FindChild方法返回一個異常'引用不是有效的可視化依賴對象',因爲它不會接受作爲DataTemplate的參數。所以我們嘗試了另一種方法:((this.View.FindName(「AdvertSlider」)作爲SlideViewExtended).ItemTemplate.LoadContent()作爲ScrollViewer)。但是這種方法創建了一個UI元素的副本,並不能幫助我們操縱ScrollViewer的滾動行爲。 – prdp89

+0

我糾正了一些對我來說顯而易見的錯誤。但回頭看後,我不確定要了解你在尋找什麼。我還糾正了代碼不可見的point2 –

+0

我們試圖在Itemscontrol的datatemplate中查找scrollviewer,我們的任務是滾動scrollviewer。 – prdp89

相關問題