2009-10-30 33 views
1

這是一個已知問題的ItemsControl雖然我無法找到一個解決辦法:(。得到一個ItemsControl(WPF)內的MediaElement的參考

XAML

<ItemsControl x:Name="myItemsControl" ItemsSource ="{Binding videos}" Grid.ColumnSpan="2"> 
     <ItemsControl.Resources> 
      <DataTemplate x:Name="myDataTemplate" DataType="{x:Type sys:String}"> 
       <Grid x:Name="sp" Width="300" Height="200"> 
        <MediaElement x:Name="myvideo" Loaded="myvideo_Loaded" UnloadedBehavior="Stop" ScrubbingEnabled="True" Stretch="Fill" Source="{Binding}" LoadedBehavior= "Play"> 
        </MediaElement> 
       </Grid> 
      </DataTemplate> 
      </ItemsControl.Resources> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <mt:TouchablePanel/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
    </ItemsControl> 

</Grid> 

所以在代碼後面我想做類似

private void myvideo_Loaded(object sender, RoutedEventArgs e) 
{ 
    //myvideo.Play(); 
    // myvideo.Pause(); 
} 

我評論說它能夠編譯。

在此先感謝

回答

1

在事件處理程序,您可以通過sender參數訪問MediaElement

private void myvideo_Loaded(object sender, RoutedEventArgs e) 
{ 
    MediaElement myVideo = sender as MediaElement; 
    if (myVideo != null) 
    { 
     myvideo.Play(); 
    } 
} 

如果您要訪問的MediaElement特定項目在ItemsControl,您可以使用ItemContainerGenerator

MediaElement myVideo = null; 
FrameworkElement container = myItemsControl.ItemContainerGenerator.ContainerFromItem(someItem) as FrameworkElement; 
if (container != null) 
{ 
    // Note: this works for an ItemsControl, not for a ListBox or ListView... 
    ContentPresenter presenter = container as ContentPresenter; 
    if (presenter != null) 
    { 
     myVideo = presenter.ContentTemplate.FindName(myVideo) 
    } 
} 
+0

謝謝,就是這樣。 – Mrme 2009-10-30 10:48:35

0

也許你會在這裏得到更好的答案,但如果沒有,你可以隨時換你的MediaElement控件爲用戶控件。在用戶控件中,您可以訂閱所需的所有事件,然後使用數據模板中的用戶控件。

:)希望這會有所幫助。