C# VisualBrush(链接到VLC)在TabControl选择更改上未更改

C# VisualBrush(链接到VLC)在TabControl选择更改上未更改,c#,wpf,tabcontrol,vlc,visualbrush,C#,Wpf,Tabcontrol,Vlc,Visualbrush,我有一个奇怪的体验,通过VLC.DotNet和一个选项卡控件将视觉画笔链接到一个VLC播放器。我已经使用VLC播放器创建了一个自定义控件来观看RTSP流,并且在给定的窗口中有多个这样的控件 问题是,如果我将所有控件放在列表视图中,它们都会正确显示。但是如果我把它们放在一个选项卡控件中,那么它总是显示第一个选定选项卡项的流,而不管我当前在哪个选项卡上。控件标签等中的所有其他内容都会正确更改,但视觉笔刷绘制的零件不会更改 “我的控件”的视图定义为: <UserControl x:Class="

我有一个奇怪的体验,通过VLC.DotNet和一个选项卡控件将视觉画笔链接到一个VLC播放器。我已经使用VLC播放器创建了一个自定义控件来观看RTSP流,并且在给定的窗口中有多个这样的控件

问题是,如果我将所有控件放在列表视图中,它们都会正确显示。但是如果我把它们放在一个选项卡控件中,那么它总是显示第一个选定选项卡项的流,而不管我当前在哪个选项卡上。控件标签等中的所有其他内容都会正确更改,但视觉笔刷绘制的零件不会更改

“我的控件”的视图定义为:

<UserControl x:Class="myApp.View.CameraMonitorView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:Wpf="clr-namespace:Vlc.DotNet.Wpf;assembly=Vlc.DotNet.Wpf"
             Loaded="UserControl_Loaded">
    <DockPanel>
        <Label Content="{Binding Name}" DockPanel.Dock="Bottom"/>
        <Grid Margin="3">
            <Grid.Background>
                <VisualBrush Stretch="Uniform">
                    <VisualBrush.Visual>
                        <Image Source="{Binding VideoSource, ElementName=vlcControl}"/>
                        <!--<Image Source="{Binding Image}" /> -->
                    </VisualBrush.Visual>
                </VisualBrush>
            </Grid.Background>
            <Wpf:VlcControl x:Name="vlcControl" Margin="3"/>
        </Grid>
    </DockPanel>
</UserControl>
<DataTemplate DataType="{x:Type vm:CameraMonitorViewModel}">
    <v:CameraMonitorView HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
</DataTemplate>
我有一个数据模板,定义为:

<UserControl x:Class="myApp.View.CameraMonitorView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:Wpf="clr-namespace:Vlc.DotNet.Wpf;assembly=Vlc.DotNet.Wpf"
             Loaded="UserControl_Loaded">
    <DockPanel>
        <Label Content="{Binding Name}" DockPanel.Dock="Bottom"/>
        <Grid Margin="3">
            <Grid.Background>
                <VisualBrush Stretch="Uniform">
                    <VisualBrush.Visual>
                        <Image Source="{Binding VideoSource, ElementName=vlcControl}"/>
                        <!--<Image Source="{Binding Image}" /> -->
                    </VisualBrush.Visual>
                </VisualBrush>
            </Grid.Background>
            <Wpf:VlcControl x:Name="vlcControl" Margin="3"/>
        </Grid>
    </DockPanel>
</UserControl>
<DataTemplate DataType="{x:Type vm:CameraMonitorViewModel}">
    <v:CameraMonitorView HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
</DataTemplate>
完整窗口视图模型有一个称为监视器的可观察集合,视图显示:

<TabControl ItemsSource="{Binding Monitors}" SelectedIndex="0" Height="300">
    <TabControl.ItemContainerStyle>
        <Style TargetType="TabItem">
            <Setter Property="Header" Value="{Binding Name}"/>
            <Setter Property="Content" Value="{Binding}"/>
        </Style>
    </TabControl.ItemContainerStyle>
</TabControl>
<ListView ItemsSource="{Binding Monitors}" Height="300" />
ListView可以正确地显示每个摄像头的不同图像。选项卡项将始终显示相同的摄影机,但当我单击不同的选项卡时,控件的标签项会发生更改。此外,如果我将VLC控件图像的数据绑定替换为注释掉的静态图像对象,该对象的源通过视图模型设置,那么当我单击不同的选项卡时,图像将正确更改


我真的很困惑,希望能提供任何帮助。

是的,正如我在对问题的评论中指出的,问题是我正在根据控件的已加载事件启动流播放。但是它似乎在第二个选项卡之后没有被触发,可能是因为Rachel在这里提到的:它重用模板而不是加载多个模板。

尝试删除'SelectedIndex=0'@h.alex不走运。删除该行意味着最初没有选择任何选项卡。一旦我选择了一个,相机的视图就会“卡住”,成为唯一会出现的视图。哦,天哪。加载其父用户控件后,我启动VLC控件播放。我刚刚检查了一下,只有一个控件从tab控件加载,而且只有在我单击了一个选项卡之后,如果我没有选择索引的话。所以我完全忽略了这个问题。感谢h.alex帮助我找到此>您可以将IsSelected属性添加到视图模型中,删除SelectedIndex=0,然后使用SelectedItem={Binding SelectedMonitor},然后将SelectedMonitor属性添加到具有Monitors属性的主视图模型中,并在SelectedMonitor的setter中设置所选监视器的IsSelected,并将启动它的代码添加到IsSelected属性setter中,而不是加载的事件。@h.alex因此,唯一的问题是播放流的代码实际上需要VLC控件,ViewModel无法访问MVVM等等。我还希望所有的流同时运行,它们相对来说不会占用太多带宽,而且启动时间有点过长。我真的想要多个VLC控件,而tabcontrol显然不想给我。所以我可能需要找到一个解决方案,而不是tabcontrol。我懂了。请调查一下。它应该有助于从TabControl获取多个VLC控件。除此之外,在这种情况下,我个人会说,将控件实例放入您的VM中是可以的。使用VLC控件的load事件,它的DataContext应该是您的VM,并将其传递给VM。如果你想:@h.alex谢谢你。我已经找到了codeproject,但是很高兴能够确认这一点,并且能够访问VM中的控件。我有另一个类似的情况,我做了你描述的事情,感觉有点脏。谢谢,祝你好运!我在一个生产应用程序中使用这个代码项目,它工作得很好。没问题,干杯!