2015-12-21 37 views
3

獲得代碼元素後面我有如下定義的DataTemplate一個FlipView控制:如何從的DataTemplate

<FlipView x:Name="FlipView5Horizontal" Width="480" Height="270" BorderBrush="Black" BorderThickness="1" Style="{StaticResource FlipViewStyle1}"> 
     <FlipView.ItemTemplate> 
      <DataTemplate> 
      <Grid> 
       <Image Width="480" Name="xxxImage" Height="270" Source="{Binding Image}" Stretch="UniformToFill"/> 
       <Border Name="xxxBorder" Background="#A5000000" Height="80" VerticalAlignment="Bottom"> 
       <TextBlock Name="xxxTB" Text="{Binding Title}" FontFamily="Segoe UI" FontSize="26.667" Foreground="#CCFFFFFF" Padding="15,20"/> 
       </Border> 
      </Grid> 
      </DataTemplate> 
     </FlipView.ItemTemplate> 
     </FlipView> 

在後面我的代碼,我需要有機會獲得名爲「xxxTB」 TextBlock的。這裏是我的代碼來做到這一點:

public IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject 
     { 
      if (depObj != null) 
      { 
       for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
       { 
        DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 
        if (child != null && child is T) 
        { 
         yield return (T)child; 
        } 

        foreach (T childOfChild in FindVisualChildren<T>(child)) 
        { 
         yield return childOfChild; 
        } 
       } 
      } 
     } 

public void TestMethod() 
{ 
     foreach (var item in FindVisualChildren<TextBlock>(this)) 
     { 
      if (timeLine.Name == "xxxTB") 
      { }      
     } 
} 

但是,當它發現在的VisualTree的FlipView,它返回:for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)因爲VisualTreeHelper.GetChildrenCount(depObj)不返回任何東西。

有什麼想法?

+0

使用'GetTemplateChild(「xxxTB」)'。 –

+0

我試過了,但是它返回null。 – tavier

+0

看到這不會幫助:http://wpftutorial.net/DataTemplates.html – Bayeni

回答

0

所以這裏是一個有效的解決方案:

public void TestMethod() 
{ 
    DataTemplate dt = FlipView5Horizontal.ItemTemplate; 
    DependencyObject dio = dt.LoadContent(); 
    foreach (var timeLine in FindVisualChildren<TextBlock>(dio)) //FindVisualTree is defined in the question :) 
    { 
     if (timeLine.Name == "xxxTB") 
     { } 
    } 
} 

現在,我至少能夠加載控件。 (但是,我知道這個技巧不應該在重寫的方法OnApplyTemplate中出於某種原因使用)。

2

試試這個

ContentPresenter cp = GetFrameworkElementByName<ContentPresenter>(FlipView5Horizontal); 
       DataTemplate dt = FlipView5Horizontal.ItemTemplate; 
       TextBlock l = (dt.FindName("xxxTB", cp)) as TextBlock; 




private static T GetFrameworkElementByName<T>(FrameworkElement referenceElement) where T : FrameworkElement 
      { 
       FrameworkElement child = null; 
       for (Int32 i = 0; i < VisualTreeHelper.GetChildrenCount(referenceElement); i++) 
       { 
        child = VisualTreeHelper.GetChild(referenceElement, i) as FrameworkElement; 
        System.Diagnostics.Debug.WriteLine(child); 
        if (child != null && child.GetType() == typeof(T)) 
        { 
         break; 
        } 
        else if (child != null) 
        { 
         child = GetFrameworkElementByName<T>(child); 
         if (child != null && child.GetType() == typeof(T)) 
         { 
          break; 
         } 
        } 
       } 
       return child as T; 
      } 
+0

我得到dt.FindName API不存在。 – tavier

1

你可以試試這個:

var textblock = IteratingKeyboardChildren(g, keyName); 

Border IteratingKeyboardChildren(Grid g, string keyName) 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(g); i++) 
     { 
      var child = VisualTreeHelper.GetChild(g, i); 
      if (child is TextBlock) 
      { 
       if ((child as TextBlock).Tag.ToString().Equals(keyName)) 
        return child as TextBlock ; 
      } 
     } 
     return null; 
    } 
相關問題