2011-09-13 50 views
7

Tôi đang cố gắng tạo lưới bằng lập trình và thêm điều khiển tùy chỉnh làm trẻ vào lưới là hàng 0 cột 0 trong ma trận 2x2. Để làm cho vấn đề trở nên phức tạp hơn, tôi đang sử dụng mẫu thiết kế MVVM. Heres một số mã để giúp mọi người có được ý tưởng:Tạo lập trình lưới bằng phần tử tùy chỉnh

App.xaml.cs

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

MainWindowViewModel - Phương pháp trả về 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; 
    } 

Và XAML Markup rằng lưới nên gán cho

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

Vấn đề là kiểm soát tùy chỉnh của tôi không xuất hiện trong cách bố trí lưới, heres mã XAML nào đó mà không cần mã -này và điều này không hoạt động:

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

Bất kỳ ý tưởng nào về lý do mã chương trình không hoạt động?

+0

như thế nào bạn thêm lưới mới được tạo vào chế độ xem của mình? –

+0

Thiết kế mvvm tiêu chuẩn gọi hàm tạo MainWindowViewModel để kéo thuộc tính thích hợp, thuộc tính GridWindows lưu trữ lưới được trả về từ phương thức trên - window = new Models.MainWindow {Layout = 1, GridWindows = CreateGrid()}; – bl4kh4k

+0

Có vẻ như có một vài điều sai với mã của bạn. Trong MVVM, bạn không nên tạo các điều khiển giao diện người dùng trong ViewModel. Vấn đề với cách bạn đã có nó - xác định lưới trong xaml là gì? – kevev22

Trả lời

7

nếu bạn đang tạo Grid trong xaml thì sau này bạn không thể đặt mã đó trong mã. Lưới (ví dụ) đã có trong hình ảnh. Biến ghi đè sẽ không thực hiện bất kỳ hiệu ứng nào. Bạn nên đặt Grid làm nội dung của điều khiển được xác định xaml. Tôi đoán rằng mã của bạn trông như thế này:

Code:

this.GridWindows = createdGrid; 

XAML:

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

Trong mã bạn nên có một cái gì đó như thế này:

this.GridWindows.Children.Add(createdGrid); 
Các vấn đề liên quan