c# – 以编程方式使用自定义元素创建网格

我正在尝试以编程方式创建网格,并将自定义控件作为子项附加到网格中,作为2×2矩阵中的第0列0列.更糟糕的是,我正在使用MVVM设计模式.下面是一些代码,以帮助每个人得到这个想法:

App.xaml.cs

base.OnStartup(e);
var viewmodel = new MainWindowviewmodel();
var mainWindow = new MainWindow();
mainWindow.GridWindows = viewmodel.Window.GridWindows;

MainWindowviewmodel – 方法返回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;
    }

以及网格应分配给的XAML标记

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

问题是我的自定义控件没有出现在网格布局中,继承了没有代码隐藏的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>

有关为什么程序代码不起作用的任何想法?

解决方法

如果您在xaml中创建Grid,则以后无法在代码中设置它.网格(实例)已经在visualtree中.覆盖变量不会起任何作用.您应该将Grid设置为xaml定义控件的内容.我猜你的代码看起来像这样:

码:

this.GridWindows = createdGrid;

XAML:

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

代码中你应该有这样的东西:

this.GridWindows.Children.Add(createdGrid);

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...