2012-09-30 6 views
2

C# 코드의 "image"요소에 액세스하려고합니다. 데이터 형식에 있기 때문에 직접 액세스 할 수 없다는 것을 알고 있습니다. 시각적 트리를 사용해 보았지만 여전히 코드에서 "이미지"컨트롤 요소를 얻을 수 없습니다.xaml에 액세스하는 방법 FlipView에서 DataTemplate 내부의 컨트롤

<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

코드 서식 지정에 감사드립니다. 코드 스 니펫의 처음 두 줄을 코드 블록에 가져 오려고했지만 나 couldnt. – sankar

2

여기에 답변 https://stackoverflow.com/a/16446670/265706

짧은 대답은 : 당신이 겪고있는 문제는 DataTemplate을이 반복되고 그가 FlipView에 의해 컨텐츠가 생성되는 것입니다. 이름은 생성 된 이전 형제 (또는 앞으로있을 형제)와 충돌하기 때문에 노출되지 않습니다.

DataTemplate에서 명명 된 요소를 얻으려면 먼저 생성 된 항목을 가져온 다음 원하는 요소에 대해 해당 생성 된 항목을 검색해야합니다. XAML의 논리 트리는 이름으로 항목에 액세스하는 방법입니다. 생성 된 항목은 논리적 트리에 없습니다. 대신 비주얼 트리에 있습니다 (모든 컨트롤은 비주얼 트리에 있음). 즉, 시각적 트리에서 참조 할 컨트롤을 검색해야합니다. VisualTreeHelper를 사용하면이 작업을 수행 할 수 있습니다.

관련 문제