간단히 WPF HelloWorld를 만들어 보자.
Visual Studio 2017에서 Visual C# >> WPF 앱(.NET Framework)을 선택 후 프로젝트명은 WpfApp2으로 하자.
MainWindow.xaml을 더블클릭하여 XAML 디자인 화면을 열어서 Label, TextBox, Button 컨트롤을 그림처럼 배치하자. (TextBox : txtName, Burron : btnSayHello)
컨트롤을 올려서 완성된 MainWindow.xaml 코드
<Window x:Class="WpfApp2.MainWindow"
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"
xmlns:local="clr-namespace:WpfApp2"
mc:Ignorable="d"
Title="MainWindow" Height="181.2" Width="503.4">
<Grid Margin="0,0,0.4,1.8">
<Label x:Name="label" Content="이름을 입력하세요." HorizontalAlignment="Left" Margin="64,55,0,0" VerticalAlignment="Top" Height="34" Width="135" FontSize="14"/>
<TextBox x:Name="txtName" HorizontalAlignment="Left" Height="34" Margin="204,55,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
<Button x:Name="btnSayHello" Content="Say Hello!" HorizontalAlignment="Left" Margin="329,55,0,0" VerticalAlignment="Top" Width="75" Height="34" Click="btnSayHello_Click"/>
</Grid>
</Window>
버튼을 클릭하고 속성항에서 번개표시를 누르면 이벤트들이 나타나는데 Click 이벤트를 더블클릭 하여 이벤트 핸들러를 작성하자.
private void btnSayHello_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Hello " + txtName.Text);
}
완성된 MainWindow.xaml.cs
using System.Windows;
namespace WpfApp2
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void btnSayHello_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Hello " + txtName.Text);
}
}
}
실행화면(Ctrl + F5)
1.2 HelloWorld XAML기반 WPF 프로그램 작동 원리
WPF 프로젝트를 생성하면 App.xaml, MainWindow.xaml 두개의 xaml 파일이 생성되는데 App.xaml이 App 라는 클래스로 메인메소드(Main)를 가지면서 자동생성되고 이 메인에서 MainWindow를 StartupUri로 지정해서 MainWindow가 처음 시작된다.
App.xaml이 엔트리 포인트이며 앞에서 작성한 HelloWorld 프로젝트에서 App.g.cs 파일로 변환되어 생성된다. (App.g.i.cs 파일도 생성되는데 임시 파일로 보면 된다.)
[App.g.cs]
#pragma checksum "..\..\App.xaml" "{406ea660-64cf-4c82-b6f0-42d48172a799}" "72192FBCE1E41E0B66442FD984320E84"
//------------------------------------------------------------------------------
// <auto-generated>
// 이 코드는 도구를 사용하여 생성되었습니다.
// 런타임 버전:4.0.30319.42000
//
// 파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
// 이러한 변경 내용이 손실됩니다.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Media.TextFormatting;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Shell;
using WpfApp2;
namespace WpfApp2 {
/// <summary>
/// App
/// </summary>
public partial class App : System.Windows.Application {
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
#line 5 "..\..\App.xaml"
this.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative);
#line default
#line hidden
}
/// <summary>
/// Application Entry Point.
/// </summary>
[System.STAThreadAttribute()]
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public static void Main() {
WpfApp2.App app = new WpfApp2.App();
app.InitializeComponent();
app.Run();
}
}
}
App.xaml의 코드 비하인드 파일이 App.xaml.cs로 하나의 App라는 이름의 부분 클래스로 생성된다.
만약 App.xaml StartupUri을 삭제하면 App.xaml.cs 소스코드에서 아래처럼 OnStartUp 메소드를 오버라이드 하면 된다.
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
// here you take control
MainWindow w = new MainWindow();
w.Show();
}
}
물론 App.xaml, App.xaml.cs 파일을 모두 삭제하고 새로운 메인을 만들어도 된다.
[MyMain.cs]
using System;
using System.Windows;
namespace WpfApp2
{
class MyMain
{
[STAThread]
public static void Main()
{
Application app = new Application();
app.Run(new MainWindow());
}
}
}
만약 응용프로그램에서 Main 메소드를 가지는 클래스가 여러 개 라면 프로젝트의 속성에서 시작 클래스를 지정할 수도 있다.
#WPF, #HelloWorld