以编程方式创建WPF窗口

时间:2015-05-21 01:32:08

标签: c# .net wpf

我刚刚开始学习C#(来自Java)并且我更喜欢手动开发我的Windows,但我发现的所有MSDN指南都涉及使用XAML视图。我在哪里可以找到解释如何手动执行此操作的教程?

编辑:似乎不建议这样做,所以在特定条件为真时如何添加游戏循环或绘图等逻辑?

3 个答案:

答案 0 :(得分:8)

你会非常喜欢Charles Petzold的 Applications = Code + Markup 。他从C#代码开始,后来才引入XAML。

话虽如此,你不应该这样做。 XAML即使有其冗长的含义,也常常以非显而易见的方式隐藏大量的基础设施。像这样的琐碎代码:

<Control Foo="Text" FooExt.Bar="{Binding Text}" Grid.Column="0">

会变成这样难以理解的混乱:

var ctl = new Control();
ctl.BeginInit();
ctl.Foo = "Text";
var prop = FooExt.BarProperty;
var binding = new Binding("Text") { Source = dataContext };
BindingOperations.SetBinding(ctl, prop, binding);
Grid.SetColumn(ctl, 0);
ctl.EndEnit();

您不会喜欢编写此代码。 WPF旨在与XAML一起使用。

WPF并没有使用&#34; paint&#34;事件或类似的事情,在最低级别你&#34;画&#34;曾经,它被存储为矢量图像,框架在必要时负责重绘它。在更高级别,您添加控件,基元等,并更改其属性。同样,框架负责更新视图。在更高级别上,您只需创建用于创建控件的模型和规则,然后让框架完成剩下的工作。

WPF与&#34;传统&#34;完全不同。使用控件的方式。在提问之前,你应该阅读一本好书或至少几本完整的教程,因为你似乎并不了解基础知识。

答案 1 :(得分:1)

这不好玩,但是有可能在运行时完全构建Windows而无需XAML。

这是一个小例子:

与之通话:

{
    CrisisWhatCrisis crisisWhatCrisis = new CrisisWhatCrisis();
    crisisWhatCrisis.ShowDialog();
}

enter image description here

课程:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Test
{
    public class CrisisWhatCrisis : Window
    {
        public Grid RootGrid { get; private set; }

        public CrisisWhatCrisis()
        {
            this.WindowStyle = WindowStyle.ThreeDBorderWindow;

            this.RootGrid = new Grid()
            { HorizontalAlignment = HorizontalAlignment.Stretch, VerticalAlignment = VerticalAlignment.Stretch };

            // Create a sqare grid with 20 pixel borders 
            this.RootGrid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(20) });
            this.RootGrid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(200) }); 
            this.RootGrid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(50) });
            this.RootGrid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(20) });

            this.RootGrid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(20) });
            this.RootGrid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(200) });
            this.RootGrid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(20) });

            // Create a new Textbox and place it in the middle of the root grid
            TextBox TextBox_Test = new TextBox()
            { Text = "ABC", Background = Brushes.Yellow, HorizontalAlignment = HorizontalAlignment.Stretch, VerticalAlignment = VerticalAlignment.Top };

            Grid.SetColumn(TextBox_Test, 1);
            Grid.SetRow(TextBox_Test, 1);
            this.RootGrid.Children.Add(TextBox_Test);

            Grid GridForButtons = new Grid()
            { HorizontalAlignment = HorizontalAlignment.Stretch, VerticalAlignment = VerticalAlignment.Stretch };

            Button Button_Close = new Button() { Content = "Close" };
            Button_Close.Click += Button_Close_Click;

            // Add the button to the grid which has one cell by default
            Grid.SetColumn(Button_Close, 0);
            Grid.SetRow(Button_Close, 0);
            GridForButtons.Children.Add(Button_Close);

            // add the button grid to the RootGrid
            Grid.SetRow(GridForButtons, 2);
            Grid.SetColumn(GridForButtons, 1);
            this.RootGrid.Children.Add(GridForButtons);

            // Add the RootGrid to the content of the window
            this.Content = this.RootGrid;

            // fit the window size to the size of the RootGrid
            this.SizeToContent = SizeToContent.WidthAndHeight;
        }

        private void Button_Close_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
    }
}

答案 2 :(得分:0)

使用C#,您可以选择WPF,WinForm。如果你看到了xaml,那就是它的WPF。如果你想在后面的代码中创建窗口(而不是xaml),请执行以下操作。

MainWindow window = new MainWindow();
window.Show();

但我建议使用xaml,因为WPF提供了许多有用的方法。我推荐由Adam Nathan释放的wpf的书