【问题标题】:how to access a control within Data Template from code behind? [closed]如何从后面的代码访问数据模板中的控件? [关闭]
【发布时间】:2013-10-15 11:20:02
【问题描述】:

我在DataTemplate 中有一个MediaElement,但我无法从后面的代码中访问它。

我在下面发布 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>
</Grid>

后面的代码:

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

谁能告诉我怎么做?

【问题讨论】:

标签: c# wpf xaml


【解决方案1】:

应该能够使用FrameworkTemplate.FindName 方法访问您的控件...首先,从ListBoxItems 之一获取ContentPresenter

ContentPresenter contentPresenter = FindVisualChild<ContentPresenter>(yourListBoxItem);

然后从ContentPresenter获取DataTemplate

DataTemplate yourDataTemplate = contentPresenter.ContentTemplate;

然后从DataTemplate获取MediaElement

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

有关详细信息,请参阅 MSDN 上的FrameworkTemplate.FindName Method 页面。

【讨论】:

  • +1 只回答对这个问题有意义的答案..
  • 谢谢@nit...不幸的是,似乎我已经对这个答案投了恶意或报复性的反对票......根本没有其他理由反对它......有些人太不成熟了。
  • 忽略他们..你摇滚!!!
  • 你太客气了@nit。 :) 无论哪种方式,我都不介意失去 2 个声望点……我有足够的余地。真可惜有这样的人以这种痛苦和扭曲的方式使用 StackOverflow。我对那个用户的建议:长大!
  • 值得指出的是,FindVisualChild() 方法在 WPF 或 .NET 中本机不可用。您将需要手动添加它,例如,请参阅以下 SO 答案:stackoverflow.com/a/25229554/2737435
【解决方案2】:

您的事件处理程序中有发送者,即 ListBoxItem,而 MediaElement 是 ListBoxItem.Content

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

【讨论】:

  • -1 我相信你是不正确的。您可以使用FrameworkTemplate.FindName 方法。
  • 好吧,好吧,我的意思是你不能用像 vidList.DoSomething() 这样的变量名来做。要使用您的解决方案,您需要以某种方式访问​​ FrameworkTemplate。我提供了一个简单的工作解决方案。
  • 如果您使用不那么准确的内容编辑您的答案,我很高兴删除此反对票...您的 You can't do it by name 陈述不正确。
猜你喜欢
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 2012-04-11
  • 2012-04-30
相关资源
最近更新 更多