2013-10-15 15 views
5

Ciao ho un MediaElement all'interno dello DataTemplate ma non riesco ad accedervi dal codice sottostante.come accedere a un controllo all'interno di Data Template dal codice sottostante?

Vi metto il codice XAML di seguito:

<Grid> 
<Grid.ColumnDefinitions> 
    <ColumnDefinition Width="605*"/> 
    <ColumnDefinition Width="151*"/> 
</Grid.ColumnDefinitions> 
<GroupBox Header="My Videos" Height="177" VerticalAlignment="Top" Margin="5,320,5,0" Grid.ColumnSpan="2"> 
    <ListBox x:Name="VideoList" ItemsSource="{Binding Videos }" Width="auto" Height=" auto" Margin="0,0,0,0" Grid.ColumnSpan="2" > 
     <DataTemplate x:Name="DTVideos"> 
      <ListBoxItem Name="lbivid1" BorderThickness="2" Width="240" Selected="lbivid_Selected" > 
       <MediaElement Name="vidList" Height="150" Width="150" Source="{Binding SourceUri}" Position="00:00:05" LoadedBehavior="Pause" ScrubbingEnabled="True"/> 
      </ListBoxItem> 
     </DataTemplate> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal" Margin="0,0,0,0"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
    </ListBox> 
</GroupBox>  
<GroupBox Header="Preview" Height="320" Width="400" VerticalAlignment="Top" DockPanel.Dock="Left"> 
    <MediaElement x:Name="videoPreview" HorizontalAlignment="Left" Height="300" VerticalAlignment="Top" Width="388"/> 
</GroupBox> 

codice dietro:

private void lbivid_Selected(object sender, RoutedEventArgs e) 
{ 
    imagePreview.Visibility = Visibility.Hidden; 
    string urlStr = (VidList.Source).ToString();   
    Uri temp = new Uri(UrlStr); 
    videoPreview.Source = temp;       
} 

Può qualcuno di voi dirmi come si può fare?

+0

Eventuali duplicati http://stackoverflow.com/questions/8126700/how-do-i-access-an-element-of-a-control-template-from-within-code-behind –

+0

duplicato di [Accedere a una denominato TextBox nel codice sottostante dal DataTemplate di ContentPresenter] (http://stackoverflow.com/questions/1415771/access-a-named-textbox-in-the-code-behind-from-a-contentpresenters-datatemplate) .. per favore vedi questa domanda per la risposta. È inoltre possibile trovare una risposta diversa nel post [Controllo XAML di controllo in DataTemplate da CodeBehind?] (Http://stackoverflow.com/questions/13166726/access-xaml-control-in-datatemplate-from-codebehind). – Sheridan

+0

Che ne dici di utilizzare MVVM? per ottenere e impostare la fonte di MediaElement – JSJ

risposta

10

È dovrebbe essere in grado di accedere al vostro controllo utilizzando il metodo FrameworkTemplate.FindName ... prima, ottiene il ContentPresenter da uno dei ListBoxItem s:

ContentPresenter contentPresenter = FindVisualChild<ContentPresenter>(yourListBoxItem); 

quindi ottenere il DataTemplate dal ContentPresenter:

DataTemplate yourDataTemplate = contentPresenter.ContentTemplate; 

quindi ottenere il MediaElement dal DataTemplate:

MediaElement yourMediaElement = yourDataTemplate.FindName("vidList", contentPresenter) 
as MediaElement; 
if (yourMediaElement != null) 
{ 
    // Do something with yourMediaElement here 
} 

Si prega di consultare la pagina FrameworkTemplate.FindName Method su MSDN per ulteriori informazioni.

+0

+1 per la sola risposta che ha senso a questa domanda .. – Nitin

+0

Grazie @nit ... sfortunatamente, sembra che mi sia stato dato un voto di dispetto o di ritorsione verso il basso su questa risposta ... non c'è semplicemente nessun altro motivo per giù vota ... alcune persone sono così immature. – Sheridan

+0

ignorali .. tu rock !!! – Nitin

0

Hai mittente nel vostro gestore di eventi, che è ListBoxItem, e MediaElement è ListBoxItem.Content

var mediaElement = ((ListBoxItem)sender).Content as MediaElement; 
if (mediaElement != null) ... 
+0

-1 Credo che tu sia errato. È possibile utilizzare il metodo ['FrameworkTemplate.FindName'] (http://msdn.microsoft.com/en-us/library/system.windows.frameworktemplate.findname.aspx). – Sheridan

+0

Bene, okay, voglio dire che non puoi farlo con un nome di variabile come vidList.DoSomething(). E per usare la tua soluzione dovrai raggiungere FrameworkTemplate in qualche modo. E ho fornito una soluzione di lavoro semplice. –

+0

Sono felice di rimuovere questo voto negativo se modifichi la tua risposta con qualcosa di meno impreciso ... il tuo * Non puoi farlo per nome * la dichiarazione non è corretta. – Sheridan

Problemi correlati