2011-09-13 7 views
7

Sto cercando di creare una griglia di programmazione e aggiungendo un controllo personalizzato come un bambino alla griglia come riga 0 colonna 0 su di una matrice 2x2. Per rendere le cose più difficili, sto usando il modello di progettazione MVVM. Heres po 'di codice per aiutare tutti ottenere l'idea:livello di programmazione creare griglia con l'elemento personalizzato

App.xaml.cs

base.OnStartup(e); 
var viewModel = new MainWindowViewModel(); 
var mainWindow = new MainWindow(); 
mainWindow.GridWindows = viewModel.Window.GridWindows; 

MainWindowViewModel - metodo restituisce il GridWindows.

private Grid CreateGrid() 
    { 
     Grid grid = new Grid(); 

     // Create column definitions. 
     ColumnDefinition columnDefinition1 = new ColumnDefinition(); 
     ColumnDefinition columnDefinition2 = new ColumnDefinition(); 
     columnDefinition1.Width = new GridLength(640); 
     columnDefinition2.Width = new GridLength(640); 

     // Create row definitions. 
     RowDefinition rowDefinition1 = new RowDefinition(); 
     RowDefinition rowDefinition2 = new RowDefinition(); 
     rowDefinition1.Height = new GridLength(340); 
     rowDefinition2.Height = new GridLength(340); 

     // Attached definitions to grid. 
     grid.ColumnDefinitions.Add(columnDefinition1); 
     grid.ColumnDefinitions.Add(columnDefinition2); 
     grid.RowDefinitions.Add(rowDefinition1); 
     grid.RowDefinitions.Add(rowDefinition2); 

     // Create preview window. 
     Border border = new Border(); 
     border.BorderThickness = new Thickness(20); 
     border.Padding = new Thickness(8); 
     border.SetResourceReference(Control.BackgroundProperty, "PreviewWindow"); 

     MediaRTSPElement previewElement = new MediaRTSPElement(); 
     previewElement.Name = "RTSPStreamPlayer"; 
     previewElement.Stretch = Stretch.UniformToFill; 
     previewElement.Source = "rtsp://192.100.100.22/media/video1"; 
     previewElement.VideoRenderer = VideoRendererType.EnhancedVideoRenderer; 
     previewElement.LoadedBehavior = WPFEVR.DirectShow.Players.MediaState.Play; 
     previewElement.SpeedRatio = 0.5; 

     //border.Child = previewElement; 

     // Add preview window. 
     for (int i = 0; i < 4; i++) 
     { 
      grid.Children.Add(previewElement as UIElement); 
      Grid.SetColumn(previewElement, i); 
      Grid.SetRow(previewElement, i); 
      break; 
     } 

     return grid; 
    } 

E il XAML Markup che la griglia dovrebbe assegnare al

<Grid x:Name="GridWindows"></Grid> 

Il problema è il mio controllo personalizzato non viene visualizzata nel layout a griglia, ecco il codice XAML che lo fa senza codice -behind, e questo funziona:

 <Grid x:Name="GridWindows"> 
      <!--<Grid.ColumnDefinitions> 
       <ColumnDefinition Width="640" /> 
       <ColumnDefinition Width="640" /> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="340" /> 
       <RowDefinition Height="340" /> 
      </Grid.RowDefinitions> 
      <Border BorderThickness="20" Padding="8" Background="{DynamicResource ResourceKey=PreviewWindow}" Grid.Row="0" Grid.Column="0"> 
       <evr:MediaRTSPElement x:Name="RTSPStreamPlayer" 
           Stretch="UniformToFill" 
           VideoRenderer="EnhancedVideoRenderer" 
           LoadedBehavior="Play" 
           Source="rtsp://192.100.100.22/media/video1" 
           SpeedRatio="0.5" /> 
      </Border> 
      <Border BorderThickness="20" Padding="8" Background="{DynamicResource ResourceKey=PreviewWindow}" Grid.Row="0" Grid.Column="1"> 
       <evr:MediaRTSPElement x:Name="RTSPStreamPlayer2" 
           Stretch="UniformToFill" 
           VideoRenderer="EnhancedVideoRenderer" 
           LoadedBehavior="Play" 
           Source="rtsp://192.100.100.78/media/video1" 
           SpeedRatio="0.5" /> 
      </Border> 
      <Border BorderThickness="20" Padding="8" Background="{DynamicResource ResourceKey=PreviewWindow}" Grid.Row="1" Grid.Column="0"> 
       <evr:MediaRTSPElement x:Name="RTSPStreamPlayer3" 
           Stretch="UniformToFill" 
           VideoRenderer="EnhancedVideoRenderer" 
           LoadedBehavior="Play" 
           Source="rtsp://192.100.100.78/media/video1" 
           SpeedRatio="0.5" /> 
      </Border> 
      <Border BorderThickness="20" Padding="8" Background="{DynamicResource ResourceKey=PreviewWindow}" Grid.Row="1" Grid.Column="1"> 
       <evr:MediaRTSPElement x:Name="RTSPStreamPlayer4" 
           Stretch="UniformToFill" 
           VideoRenderer="EnhancedVideoRenderer" 
           LoadedBehavior="Play" 
           Source="rtsp://192.100.100.22/media/video1" 
           SpeedRatio="0.5" /> 
      </Border>--> 
     </Grid> 

Tutte le idee sul perché programmatica codice non funziona?

+0

Come sono aggiungi la griglia appena creata alla tua vista? –

+0

standard di progettazione MVVM chiamare il costruttore MainWindowViewModel per tirare le proprietà appropriate, le GridWindows negozi di proprietà della griglia restituito dal metodo di cui sopra - finestra = new Models.MainWindow {Piano = 1, GridWindows = CreateGrid()}; – bl4kh4k

+0

Sembra che ci siano alcune cose che non vanno nel tuo codice. In MVVM non dovresti creare controlli dell'interfaccia utente in ViewModel. Qual è il problema con il modo in cui l'hai avuto - definendo la griglia nello xaml? – kevev22

risposta

7

se si sta creando Grid nel XAML non si può in seguito impostare nel codice. Grid (istanza) è già in visualtree. La sovrascrittura della variabile non ha alcun effetto. È necessario impostare il proprio Grid come contenuto del controllo definito xaml. Sto indovinando che il codice simile a questo:

Codice:

this.GridWindows = createdGrid; 

Xaml:

<Grid x:Name="GridWindows"></Grid> 

Nel codice che dovrebbe avere qualcosa di simile:

this.GridWindows.Children.Add(createdGrid); 
Problemi correlati