更改选定项目MediaUriElement时隐藏的WPF TabControl

时间:2013-03-13 09:22:33

标签: c# wpf tabcontrol mediaelement

我有TabControl,我希望TabItems的内容中有视频。 我有将视频添加到标签内容的方法:

private void AddVideosFromListToTab(IEnumerable<VideoClass> list, TabItem tab)
    {
        var stackPanel = new StackPanel { Orientation = Orientation.Horizontal };
        foreach (
            var media in
                list.Select(
                    video =>
                    MediaUriElementHelper.CreatePreviewMediaElementUri(video.SamplePath(), 200, 150, mediaPreviewControls,
                                                                       mediaPlayer_MouseDown)))
        {
            stackPanel.Children.Add(media);
        }
        stackPanel.Children.Add(new TextBlock {Text = "Some text"});
        tab.Content = stackPanel;
    }

这是我用视频创建媒体的方法。我正在使用MediaUriElement,因为它的性能更好。

    public static MediaUriElement CreatePreviewMediaElementUri(string sourceFile, int width, int height, List<MediaUriElement> listMedias, System.Windows.Input.MouseButtonEventHandler mouseDown)
    {
        var media = new MediaUriElement();
        media.BeginInit();
        media.Width = width;
        media.Height = height;
        media.Margin = new Thickness(20);
        media.Volume = 0;
        media.LoadedBehavior = WPFMediaKit.DirectShow.MediaPlayers.MediaState.Play;
        media.MouseDown += mouseDown;
        media.Loop = true;
        media.Source = new Uri(sourceFile);
        media.EndInit();
        listMedias.Add(media);
        return media;
    }

当应用加载时没关系,但是当我选择另一个标签时没有视频,当我回到第一个标签时,就不再有了。我添加了一些文字,总是存在。所以问题在于MediaUriElement。有人知道如何解决这个问题吗?感谢

2 个答案:

答案 0 :(得分:0)

我认为因为普通的TabConrol只有一个contentPresenter,所以它会先前的内容。 如果是这样,这应该工作: Stop TabControl from recreating its children

答案 1 :(得分:0)

我已经设法修复它而不使用TabControlEx(因为它对我来说也没有用)。 我已经使用了Datatemplates和templateselector来在标签之间切换。

的Xaml:

 <Window.Resources>
    <local:MainTabViewDataTemplateSelector x:Key="myMainContentTemplateSelector" />
    <DataTemplate x:Key="Dashboard">
        <views:DashboardView />
    </DataTemplate>
    <DataTemplate x:Key="SystemHealth">
        <views:SystemHealthView />
    </DataTemplate>
</Window.Resources>
        <TabControl ItemsSource="{Binding MainTabs}"
                Margin="0,33,0,0"
                Grid.RowSpan="2"
                SelectedIndex="0"
                 Width="auto" 
                Style="{DynamicResource TabControlStyleMain}"
                ContentTemplateSelector="{StaticResource myMainContentTemplateSelector}"
                Padding="20" Grid.ColumnSpan="2"
                VerticalAlignment="Stretch">
        <TabControl.Background>

            <ImageBrush ImageSource="/SystemHealthAndDashboard;component/Images/innerBackground.png"/>

            </TabControl.Background>
        <TabControl.ItemTemplate>
            <DataTemplate >
                    <TextBlock Grid.Column="0" Text="{Binding Name}" VerticalAlignment="Center" HorizontalAlignment="Left"/>
            </DataTemplate>
        </TabControl.ItemTemplate>
    </TabControl>

DataTemplateSelector:

 public class MainTabViewDataTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        FrameworkElement element = container as FrameworkElement;
        switch ((item as TabInfoEntity).TabIndex)
        {
            case 1:
                {
                    return element.FindResource("Dashboard") as DataTemplate;
                }
            case 2:
                {
                    return element.FindResource("SystemHealth") as DataTemplate;
                }

        }
        return null;
    }
}

TabInfoEntity类(此类型的对象列表是TabControl的itemsource):

公共类TabInfoEntity     {         public TabInfoEntity()         {

    }
    private string name;

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    private int tabindex;

    public int TabIndex
    {
        get { return tabindex; }
        set { tabindex = value; }
    }
}