【问题标题】:How to code in c# programmatically (not using xaml)如何以编程方式在 C# 中编码(不使用 xaml)
【发布时间】:2014-05-28 13:08:20
【问题描述】:

我正在研究silverlight,我是初学者。我知道这个问题非常基础,但作为初学者,我需要帮助才能实现这一目标。然而我已经编写了 xaml 代码来创建 GUI,但现在我必须使用 c# 创建 GUI,我的问题是:

我知道如何创建 GUI,但我不知道如何渲染它。

就像我知道如何创建滑块一样。我是这样做的:

void createGrid()
        {
            Grid childGrid = new Grid();
            ColumnDefinition colDef1 = new ColumnDefinition();
            ColumnDefinition colDef2 = new ColumnDefinition();
            ColumnDefinition colDef3 = new ColumnDefinition();
            RowDefinition rowdef = new RowDefinition();
            childGrid.ColumnDefinitions.Add(colDef1);
            childGrid.RowDefinitions.Add(rowdef);


            Slider sl = new Slider();
            Grid.SetColumn(sl, 1);
            Grid.SetRow(sl, 0);
            childGrid.Children.Add(sl);

        }

但问题是如何渲染它。我的意思是我刚刚创建了一个名为“NoMoreLife”的项目,然后我创建了这个函数CreateGrid(),并从构造函数中调用它,如下所示:

public MainPage()
        {
            InitializeComponent();
            createGrid();
        }

我的 MainPage 类是:(其中包含代码)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace NoMoreLife
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
            createGrid();
        }
        void createGrid()
        {
            Grid childGrid = new Grid();
            ColumnDefinition colDef1 = new ColumnDefinition();
            ColumnDefinition colDef2 = new ColumnDefinition();
            ColumnDefinition colDef3 = new ColumnDefinition();
            RowDefinition rowdef = new RowDefinition();
            childGrid.ColumnDefinitions.Add(colDef1);
            childGrid.RowDefinitions.Add(rowdef);


            Slider sl = new Slider();
            Grid.SetColumn(sl, 1);
            Grid.SetRow(sl, 0);
            childGrid.Children.Add(sl);

        }
    }
}

而 MainPage.xaml 是:

<UserControl x:Class="NoMoreLife.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <Grid x:Name="LayoutRoot" Background="White">    
    </Grid>
</UserControl>

我应该如何渲染我使用 c# 创建的这个滑块?因为目前当我运行程序时,我什么也看不到(没有滑块)。

编辑:在丹的评论之后:

我已经在我的项目中添加了 check.cs 类,现在这个类包含代码:

namespace NoMoreLife
    {
        public static class check
        {
            public static void createGrid()
            {
                Grid childGrid = new Grid();
                ColumnDefinition colDef1 = new ColumnDefinition();
                ColumnDefinition colDef2 = new ColumnDefinition();
                ColumnDefinition colDef3 = new ColumnDefinition();
                RowDefinition rowdef = new RowDefinition();
                childGrid.ColumnDefinitions.Add(colDef1);
                childGrid.ColumnDefinitions.Add(colDef2);
                childGrid.ColumnDefinitions.Add(colDef3);
                childGrid.RowDefinitions.Add(rowdef);

                Slider sl = new Slider();
                Grid.SetColumn(sl, 1);
                Grid.SetRow(sl, 1);
                childGrid.Children.Add(sl);
               // LayoutRoot.Children.Add(childGrid);
                this.Content = childGrid;
            }
        }
    }

我对函数的调用是:

namespace NoMoreLife
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
            check.createGrid();           
        }        
    }
}

这里 this.Content = childGrid;给出错误。

注意:请注意,我必须在 c# 中编写代码,而不是在 xaml 中。

【问题讨论】:

  • “他们”是谁?因为以这种方式编写 UI 是荒谬的,除非是作为学术练习......
  • LayoutRoot.Children.Add(childGrid);会将您以实用方式创建的 chidlGrid 添加到页面上现有的 Grid 中。
  • @user234839:那么,为什么你必须只用 C# 编写代码?这是构建 WPF GUI 的一种低效且不灵活的方式...
  • @DanPuzey 只是为了获得编码经验。
  • @user234839:如果你想练习编码,我建议你练习一些有意义和明智的事情。您不会尝试用海绵蛋糕制作家具来获得烹饪经验!我的意思是:这不太可能是一次宝贵的经历。

标签: c# .net silverlight xaml silverlight-5.0


【解决方案1】:

您正在代码中创建Grid,但您没有对它做任何事情。通常,您可能希望将该网格包含在表单的内容中。尝试在 createGrid 方法的底部添加这一行:

this.Content = childGrid;

EDIT(针对问题中的更新代码):

由于您的代码位于窗口的单独类中,因此您可能希望这样做:

  1. 将您的方法 createGridvoid 更改为返回 childGrid

  2. 在页面的构造函数中使用方法的结果:

public MainPage() { InitializeComponent(); this.Content = check.createGrid(); }

【讨论】:

  • 是的,它奏效了。我会尽快将其标记为答案,因为我无法在 10 分钟内标记。
  • 感谢您的回答,如果我有另一个类(而不是 MainPage),那么我将如何呈现 UI?因为如果我尝试添加此代码,则“Content”和“LayoutRoot”不存在,那么它会给出错误,它们是未知的,并且我缺少一些参考或程序集。
  • 感谢您的回答,如果我有另一个类(而不是 MainPage),那么我将如何呈现 UI?因为如果我尝试添加此代码,则“内容”和“LayoutRoot”不存在,那么它会给出错误,它们是未知的,我缺少一些参考或程序集
  • 您需要分享您实际拥有的代码;给出的答案与您迄今为止共享的代码相匹配。如果您尝试从窗口或控件外部构建 UI,那么它不会那么容易(您需要将此代码中的网格返回或传递给 UI 容器)。真的,这是一种创建 UI 的可怕方式 - 我希望有一种更简单的方法可以解决您使用 Xaml 和模板所遇到的任何问题。
  • 我刚刚为您编辑了代码。问题是我在已经存在的项目中有这种情况,所以没有更多选择
猜你喜欢
  • 2017-03-14
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
相关资源
最近更新 更多