2013-10-15 17 views
5

您好我有一个MediaElementDataTemplate之内,但我无法从后面的代码访问它。下面如何从后台代码访问数据模板中的控件?

我张贴XAML代码:

<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> 

后面的代码:

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;       
} 

能有人对你,请告诉我怎么能做到呢?

+0

可能的重复http://stackoverflow.com/questions/8126700/how-do-i-access-an-element-of-a-control-template-from-within-code-behind –

+0

重复[Access a在ContentPresenter的DataTemplate后面的代码中名为TextBox](http://stackoverflow.com/questions/1415771/access-a-named-textbox-in-the-code-behind-from-a-contentpresenters-datatemplate)..请看这个问题的答案。你也可以在[在CodeBehind的DataTemplate中访问XAML控件?](http://stackoverflow.com/questions/13166726/access-xaml-control-in-datatemplate-from-codebehind)文章中找到不同的答案。 – Sheridan

+0

如何使用MVVM?获取并设置MediaElement的来源 – JSJ

回答

10

应该能够使用FrameworkTemplate.FindName方法来访问你的控制......第一,拿到ContentPresenterListBoxItem S的一个:

ContentPresenter contentPresenter = FindVisualChild<ContentPresenter>(yourListBoxItem); 

然后得到从ContentPresenterDataTemplate

DataTemplate yourDataTemplate = contentPresenter.ContentTemplate; 

然后得到从DataTemplateMediaElement

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

请参阅MSDN上的FrameworkTemplate.FindName Method页面了解更多信息。

+0

+1对于这个问题才有意义的答案.. – Nitin

+0

谢谢@nit ...不幸的是,似乎我已经对这个答案进行了恶意或报复性的投票...根本没有其他理由投下它....有些人是如此不成熟。 – Sheridan

+0

忽略他们..你摇滚!!! – Nitin

0

你在你的事件处理程序,这是一个ListBoxItem发件人和MediaElement的是ListBoxItem.Content

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

-1我相信你是不正确的。您可以使用['FrameworkTemplate.FindName'](http://msdn.microsoft.com/zh-cn/library/system.windows.frameworktemplate.findname.aspx)方法。 – Sheridan

+0

好吧,好吧,我的意思是你不能通过像vidList.DoSomething()这样的变量来完成它。要使用您的解决方案,您需要以某种方式访问​​FrameworkTemplate。我提供了一个简单的工作解决方案。 –

+0

如果你用一些不准确的方式编辑你的答案,我很高兴删除这个投票。你的*你不能通过名称来做*声明是不正确的。 – Sheridan

相关问题