我通过视觉画笔(通过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控件的图像替换为注释掉的静态图像对象(其源是通过视图模型设置的),那么当我单击不同的选项卡时图像将正确更改。
我真的很困惑,并希望能提供任何帮助。
答案 0 :(得分:0)
是的,正如我在问题评论中指出的那样,问题是我正在根据控件的Loaded事件开始播放流。但似乎在第二个标签后它没有被触发,可能是因为Rachel在这里提到的:Loaded event doesn't fire for the 4th TabControl tab(因为它重用模板而不是加载多个模板)。