2012-09-30 34 views
2

我想訪問C#代碼中的「image」元素。我知道我無法直接訪問它,因爲它在數據模式中。我嘗試過可視化樹,但仍然無法在代碼中獲得「圖像」控制元素。如何訪問FlipView中的DataTemplate內部的xaml控件

<FlipView 
      x:Name="flipView" 
      AutomationProperties.AutomationId="ItemsFlipView" 
      AutomationProperties.Name="Item Details" 
      TabIndex="1" 
      Grid.RowSpan="2" 
      ItemsSource="{Binding Source={StaticResource itemsViewSource}}" SelectionChanged="flipView_SelectionChanged"> 

      <FlipView.ItemContainerStyle> 
       <Style TargetType="FlipViewItem"> 
        <Setter Property="Margin" Value="0,137,0,0"/> 
       </Style> 
      </FlipView.ItemContainerStyle> 

      <FlipView.ItemTemplate> 
       <DataTemplate> 

        <!-- 
         UserControl chosen as the templated item because it supports visual state management 
         Loaded/unloaded events explicitly subscribe to view state updates from the page 
        --> 
        <UserControl Loaded="StartLayoutUpdates" Unloaded="StopLayoutUpdates"> 
         <ScrollViewer x:Name="scrollViewer" Style="{StaticResource HorizontalScrollViewerStyle}" Grid.Row="1"> 

          <!-- Content is allowed to flow across as many columns as needed --> 
          <common:RichTextColumns x:Name="richTextColumns" Margin="117,0,117,47"> 
           <RichTextBlock x:Name="richTextBlock" Width="560" Style="{StaticResource ItemRichTextStyle}" IsTextSelectionEnabled="False"> 
            <Paragraph> 
             <Run FontSize="26.667" FontWeight="Light" Text="{Binding Title}"/> 
             <LineBreak/> 
             <LineBreak/> 
             <Run FontWeight="Normal" Text="{Binding Subtitle}"/> 
            </Paragraph> 
            <Paragraph LineStackingStrategy="MaxHeight"> 
             <InlineUIContainer> 
              <Image x:Name="image" MaxHeight="480" Margin="0,20,0,10" Stretch="Uniform" Source="{Binding Image}" AutomationProperties.Name="{Binding Title}"/> 
             </InlineUIContainer> 
            </Paragraph>         
           </RichTextBlock> 
          </common:RichTextColumns> 
         </ScrollViewer> 
        </UserControl> 
       </DataTemplate> 
      </FlipView.ItemTemplate> 
</FlipView> 
+1

標記-1的人,我想你不知道答案。 – user1106633

+0

爲什麼你需要從代碼訪問圖像?你想實現什麼?這可能比直接從代碼背後操縱控件更好。 –

+0

似乎是重複的http://stackoverflow.com/questions/16375375/how-do-i-access-a-control-inside-a-xaml-datatemplate –

回答

3

我試過了,我可以像上面描述的那樣訪問FlipView DataTemplate裏面的控件。嘗試下面的方法,讓我知道這是否有幫助。

public static IEnumerable<T> RecurseChildren<T>(DependencyObject root) where T : UIElement 
{ 
    if (root is T) 
    { 
     yield return root as T; 
    } 

    if (root != null) 
    { 
     var count = VisualTreeHelper.GetChildrenCount(root); 


     for (var idx = 0; idx < count; idx++) 
     { 
      foreach (var child in RecurseChildren<T>(VisualTreeHelper.GetChild(root, idx))) 
      { 
       yield return child; 
      } 
     } 
    } 
} 

訪問映像控制:

var imageControl = RecurseChildren<Image>(rootVisual).FirstOrDefault(); 

這裏rootVisual是在我的網頁網格實例。

+0

感謝Damir格式化代碼。我試圖將代碼片段的前兩行放入代碼塊,但我不能。 – sankar

2

在這裏找到答案https://stackoverflow.com/a/16446670/265706

簡短的回答是:你所遇到的問題是,DataTemplate中的重複和他FlipView正在生成的內容。該名稱未公開,因爲它會與之前生成的兄弟(或下一個兄弟)發生衝突。

因此,要獲取DataTemplate中的命名元素,必須首先獲取生成的項目,然後在生成的項目內搜索所需的元素。記住,XAML中的邏輯樹就是你如何通過名字訪問事物。生成的項目不在邏輯樹中。相反,它們位於可視樹中(所有控件均位於可視樹中)。這意味着它在Visual Tree中必須搜索想要引用的控件。 VisualTreeHelper可以讓你做到這一點。

相關問題