2013-03-03 3 views
8

Ich habe ein MediaElement, das in der Dataplate von Flipview befindet, möchte ich auf das MediaElement mit dem Namen "Video" im Code hinter zugreifen, so dass ich kann zuweisen Eigenschaften wie Wiedergabe, Pause, usw., um durch Tasten hier ist der Code von dem, was ich zu tun habe versucht:Zugriff auf ein Steuerelement in der Datenvorlage in C# Metro UI im Code hinter

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

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

    <FlipView.ItemTemplate> 
     <DataTemplate> 
      <UserControl Loaded="StartLayoutUpdates" Unloaded="StopLayoutUpdates"> 
       <ScrollViewer x:Name="scrollViewer" Style="{StaticResource VerticalScrollViewerStyle}" Grid.Row="1"> 
        <Grid Margin="120,0,20,20"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="400" /> 
          <ColumnDefinition Width="40" /> 
          <ColumnDefinition Width="360" /> 
          <ColumnDefinition Width="40" /> 
          <ColumnDefinition /> 
         </Grid.ColumnDefinitions> 
         <Border BorderBrush="Black" BorderThickness="1" Width="350" HorizontalAlignment="Left" Grid.Row="0"> 
          <MediaElement x:Name="Video" AutomationProperties.Name="Video" Source="/Assets/Big_Buck_Bunny.mp4" HorizontalAlignment="Center" VerticalAlignment="Stretch" Height="250" Width="350" AutoPlay="True" IsLooping="True" /> 
         </Border> 
         <Border BorderBrush="Black" BorderThickness="1" Height="65" Width="350" HorizontalAlignment="Left" Grid.Row="1"> 
          <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center"> 
           <Button x:Name="playButton" Margin="0,0" Click="playButton_Click" Style="{StaticResource PlayAppBarButtonStyle}" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
           <Button x:Name="pauseButton" Margin="0,0" Click="pauseButton_Click" Style="{StaticResource PauseAppBarButtonStyle}" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
          </StackPanel> 
         </Border> 
        </Grid> 
       </ScrollViewer> 
      </UserControl> 
     </DataTemplate> 
    </FlipView.ItemTemplate> 
</FlipView> 

Wie erreiche ich das gedacht?

Antwort

20

Versuchen Sie Folgendes:

private DependencyObject FindChildControl<T>(DependencyObject control, string ctrlName) 
    { 
     int childNumber = VisualTreeHelper.GetChildrenCount(control); 
     for (int i = 0; i < childNumber; i++) 
     { 
      DependencyObject child = VisualTreeHelper.GetChild(control, i); 
      FrameworkElement fe = child as FrameworkElement; 
      // Not a framework element or is null 
      if (fe == null) return null; 

      if (child is T && fe.Name == ctrlName) 
      { 
       // Found the control so return 
       return child; 
      } 
      else 
      { 
       // Not found it - search children 
       DependencyObject nextLevel = FindChildControl<T>(child, ctrlName); 
       if (nextLevel != null) 
        return nextLevel; 
      } 
     } 
     return null; 
    } 

es dann rufen Sie von der Wiedergabe/Pause-Taste Taste:

MediaElement media = FindChildControl<MediaElement>(this, "media") as MediaElement; 
    media.Play(); 

A related blog post on the subject

1

ich einen Blog-Artikel zu diesem Thema über ein Jahr schrieb vor. Vielleicht hilft es Ihnen: http://blog.jerrynixon.com/2012/09/how-to-access-named-control-inside-xaml.html

Das Wesentliche ist dies. Sie müssen den visuellen Baum analysieren, um alle Elemente zu erhalten, und dann können Sie LINQ verwenden, um die Ergebnisse zu filtern und Ihre Objekte zu erhalten.

+0

Nixon Dank für die Antwort habe ich bereits Ihrem Artikel gesehen Es ist sehr informativ, aber ich hatte Zweifel, wofür ich eine Frage in Ihrem Blog hinterlassen habe, werfen Sie einen Blick darauf – Justice

0

Ich erweiterte Jerrys Lösung zu einer flexibleren und leistungsfähigeren Lösung, um nur die gewünschten Steuerelemente zu erhalten und keine Zwischenlisten während rekursiver Aufrufe zu erstellen.

können Sie einfach so mit der Kontrolle zu bekommen:

var myControl = AllChildren(parent, c => c.Name == "xxx").FirstOrDefault(); 

Dafür sollten Sie die folgenden AllChildren funcion umfassen:

private List<Control> AllChildren(DependencyObject parent, Func<DependencyObject, bool> query, List<Control> _List = null) 
    { 
     if (_List == null) 
      _List = new List<Control>(); 

     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) 
     { 
      var _Child = VisualTreeHelper.GetChild(parent, i); 
      if (_Child is Control && query(_Child)) 
      { 

       _List.Add(_Child as Control); 
      } 
      AllChildren(_Child, query, _List); 
     } 
     return _List; 
    }