VisualBrush(链接到VLC)没有';t在TabControl选择更改时发生更改

本文关键字:TabControl 选择 链接 VLC 没有 VisualBrush | 更新日期: 2023-09-27 18:25:20

我有一个奇怪的体验,使用视觉画笔(通过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>

视图后面的代码开始播放RTSP,但我认为这些代码对解决这个问题没有帮助。

同时,ViewModel(为了便于查看而精简)只是:

class CameraMonitorViewModel : ViewModelBase
{
    public CameraMonitorViewModel(string name, string image)
    {
        Name = name;
        Image = image;
    }
    public string Name {get; set;}
    public string Image { get; set; }
}

我有一个数据模板定义为:

<DataTemplate DataType="{x:Type vm:CameraMonitorViewModel}">
    <v:CameraMonitorView HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
</DataTemplate>

全窗口视图模型有一个名为Monitors的ObservableCollection,视图显示:

<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控件图像的数据绑定替换为注释掉的静态图像对象(其源是通过视图模型设置的),那么当我单击不同的选项卡时,图像将正确更改。

我真的很困惑,如果能提供任何帮助,我将不胜感激。

VisualBrush(链接到VLC)没有';t在TabControl选择更改时发生更改

是的,正如我在对问题的评论中所指出的,问题是我正在根据控件的Loaded事件启动流播放。但它似乎并没有在第二个标签后被解雇,可能是因为Rachel在这里提到的:Loaded event并没有;t为第4个TabControl选项卡开火(因为它重用模板而不是加载多个模板)。