微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/csharp/99622.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐