2014-10-01 31 views
2

我有一個與視覺刷(通過VLC.DotNet鏈接到一個VLC播放器)和一個選項卡控件的組合奇怪的經驗。我使用VLC播放器創建了一個自定義控件來觀看RTSP流,並在給定窗口中擁有多個這些控件。VisualBrush(鏈接到VLC)不改變TabControl選擇變化

問題是,如果我把所有的控件放在列表視圖中,它們都會正常顯示。但是,如果我將它們放在一個選項卡控件中,那麼它總是顯示第一個選定選項卡項目的流,不管我目前在使用哪個選項卡。控件中的其他所有內容(標籤等)都會正確更改,但不是由可視化筆刷繪製的部分。

我控制視圖定義爲:

<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,但我不認爲代碼將有助於解決這個問題。

同時視圖模型(剝離下來,便於觀看的)就是:

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顯示器和視圖顯示:

<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正確顯示來自每臺相機的不同圖像。該標籤項目將始終顯示相同的相機,但是當我點擊不同的標籤時,控件的標籤項目會發生變化。此外,如果我將VCL控件的數據綁定替換爲註釋掉的靜態圖像對象(其源代碼是通過視圖模型設置的),那麼當我單擊不同的選項卡時,圖像會正確更改。

我真的很困惑,並希望可以提供任何幫助。

+0

嘗試刪除'SelectedIndex =「0」' – 2014-10-01 21:58:56

+0

@ h.alex沒有運氣。刪除該行意味着最初沒有選擇任何選項卡。一旦我選擇了一個,該攝像機的視圖就會「卡住」,成爲唯一顯示的視圖。 – Colin 2014-10-01 22:09:44

+1

哎呀。一旦加載父用戶控件,我就開始播放VLC控件。我只是檢查,只有一個控件從選項卡控件加載(只有當我點擊一個選項卡,如果我沒有選定的索引)。所以我完全錯過了這個問題。感謝h.alex幫我找到了這個>< – Colin 2014-10-01 22:16:21

回答

0

是的,正如我在問題的評論中指出的那樣,問題是我開始基於Loaded事件播放流控件。但似乎它在第二個標籤之後沒有被解僱,可能是因爲Rachel在這裏提到:Loaded event doesn't fire for the 4th TabControl tab(因爲它重複使用模板而不是加載多個)。

+0

你可以在你的視圖模型中添加一個IsSelected屬性,刪除SelectedIndex = 0,而改爲使用SelectedItem = {Binding SelectedMonitor},然後將SelectedMonitor屬性添加到你的主視圖模型中一個具有Monitors屬性),並在SelectedMonitor的setter中設置所選監視器的IsSelected,並添加代碼以將其啓動到IsSelected屬性設置器而不是Loaded事件。 – 2014-10-01 22:48:12

+0

@ h.alex所以唯一的問題是播放流的代碼實際上需要VLC控件,ViewModel無法訪問(MVVM和所有這些)。我還想讓所有的流同時運行(相對而言,它們沒有消耗太多帶寬,啓動時間有點過長)。我誠實地想要tabcontrol顯然不想給我的多個VLC控件。所以我可能不得不尋找一個涉及tabcontrol以外的解決方案。 – Colin 2014-10-01 23:02:27

+0

哦。我懂了。請查看[this](http://www.codeproject.com/Articles/460989/WPF-TabControl-Turning-Off-Tab-Virtualization)。它應該有助於從TabControl獲取多個VLC控件。除此之外,當我個人認爲將控件實例放入虛擬機時可能會發生這種情況。使用VLC控件的加載事件,它的DataContext應該是您的VM,並將其傳遞給VM。如果你想:) – 2014-10-01 23:15:46