VisualBrush (связанный с VLC) не меняется при изменении выбора TabControl

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

Я действительно смущен и был бы признателен за любую помощь, которая может быть предоставлена.


person Colin    schedule 01.10.2014    source источник
comment
попробуйте удалить SelectedIndex=0   -  person h.alex    schedule 02.10.2014
comment
@h.alex Не повезло. Удаление этой строки означает, что изначально ни одна из вкладок не выбрана. Как только я выбираю один, вид с этой камеры «застревает» как единственный вид, который будет отображаться.   -  person Colin    schedule 02.10.2014
comment
О боже. Я запускаю воспроизведение элемента управления VLC после загрузки его родительского пользовательского элемента управления. И я только что проверил, и только один элемент управления загружается из элемента управления вкладкой (и только после того, как я нажму на вкладку, если у меня нет выбранного индекса). Так что я полностью пропустил этот вопрос. Спасибо h.alex за помощь в поиске этого ›‹   -  person Colin    schedule 02.10.2014


Ответы (1)


Да, как я отметил в комментарии к вопросу, проблема заключалась в том, что я запускал воспроизведение потока на основе события Loaded для элемента управления. Но похоже, что после второй вкладки он не запускается, вероятно, из-за того, что здесь упоминает Рэйчел: Событие Loaded не срабатывает для 4-й вкладки TabControl (поскольку оно повторно использует шаблон, а не загружает несколько).

person Colin    schedule 01.10.2014
comment
вы можете добавить свойство IsSelected в свою модель представления, удалить SelectedIndex = 0 и вместо этого использовать SelectedItem = {Binding SelectedMonitor}, а затем добавить свойство SelectedMonitor в свою основную модель представления (та, которая имеет свойство Monitors) и в установщике SelectedMonitor задает IsSelected выбранного монитора и добавляет код для его запуска в установщик свойства IsSelected вместо события Loaded. - person h.alex; 02.10.2014
comment
@h.alex Итак, единственная проблема заключается в том, что код для воспроизведения потока на самом деле требует элемента управления VLC, к которому у ViewModel нет доступа (MVVM и все такое). И я также хотел бы, чтобы все потоки работали одновременно (относительно говоря, они не потребляют столько пропускной способности, а время запуска немного чрезмерно). Я честно ХОЧУ несколько элементов управления VLC, которые, по-видимому, tabcontrol не хочет мне давать. Так что мне, вероятно, придется найти решение, связанное с чем-то другим, кроме tabcontrol. - person Colin; 02.10.2014
comment
Ой. Я понимаю. Ознакомьтесь с этим. Это должно помочь с получением нескольких элементов управления VLC из TabControl. Кроме этого, это тот случай, когда я бы лично сказал, что можно получить экземпляр элемента управления на вашей виртуальной машине. Используйте событие загрузки вашего элемента управления VLC, его DataContext должен быть вашей виртуальной машиной, и передайте его виртуальной машине. Если ты хочешь :) - person h.alex; 02.10.2014
comment
@h.alex Спасибо. Я нашел этот codeproject, но приятно иметь подтверждение об этом, а также о получении доступа к элементу управления в виртуальной машине (у меня есть другая похожая ситуация, когда я сделал то, что вы описали, и чувствовал себя немного грязным). Спасибо и удачи! - person Colin; 02.10.2014
comment
Я использую этот codeproject в рабочем приложении, он отлично работает. Нет проблем, здравствуйте! - person h.alex; 02.10.2014