У меня странный опыт с комбинацией визуальной кисти (связанной с проигрывателем VLC через VLC.DotNet) и элементом управления вкладками. Я создал настраиваемый элемент управления с помощью проигрывателя 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>
Модель полноэкранного представления имеет ObservableCollection с именем Monitors, и в представлении отображаются:
<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 на закомментированный объект статического изображения (чей источник установлен с помощью модели представления), то изображение будет правильно меняться, когда я нажимаю разные вкладки.
Я действительно смущен и был бы признателен за любую помощь, которая может быть предоставлена.