2011-09-13 20 views
7

プログラムでグリッドを作成し、グリッドに子としてカスタムコントロールを2行2列の行0列0として追加しようとしています。問題をもっと複雑にするために、私はMVVMデザインパターンを使用しています。 HERESにいくつかのコードは、誰もがアイデアを得る手助けしますプログラムでカスタム要素を使用してグリッドを作成する

App.xaml.cs

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

MainWindowViewModel - メソッドがGridWindowsを返します。グリッドは

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

に割り当てる必要があることを

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; 
    } 

そして、XAMLマークアップの問題は、私のカスタムコントロールは、グリッドレイアウト、コードなしでそれをしないHERESにXAMLコードに表示されないですプログラム的なコードが動作していない理由として

 <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> 

任意のアイデア:-behind、これは動作しますか?

+0

:コードで

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

をあなたはこのような何かを持っている必要があります新しく作成したグリッドをビューに追加しますか? –

+0

標準のmvvmデザインは、MainWindowViewModelコンストラクタを呼び出して適切なプロパティを取得します。GridWindowsプロパティは、上記のメソッドから返されたグリッドを保存します - window = new Models.MainWindow {Layout = 1、GridWindows = CreateGrid()}; – bl4kh4k

+0

コードにはかなりの問題があるようです。 MVVMでは、ViewModelでUIコントロールを作成しないでください。あなたがそれを持っていた方法で、問題は何でしたか?xamlにグリッドを定義しましたか? – kevev22

答えて

7

xamlにGridを作成している場合は、コードで後で設定することはできません。 Grid(インスタンス)は既にvisualtreeにあります。変数を上書きしても効果はありません。 Gridをxaml定義のコントロールの内容として設定する必要があります。私はあなたのコードは次のようになります推測している:

コード:

this.GridWindows = createdGrid; 

はXAML:どのように

this.GridWindows.Children.Add(createdGrid); 
関連する問題