WPF 윈도우 만들기

WPF는 (Windows Presentation Foundation)는

데스트톱 클라이언트 앱을 만드는 UI 프레임워크입니다.

 

MS사가 개발한 .NET 환경의 GUI 중 하나 입니다.

처음 개발되었을 때가 벌써 20년 전이라서

당시만 해도 지금과 같은 크로스 플랫폼 개념이

희박했던 MS였기에 윈도우즈 OS점유율을

확장하기 위한 제품이었습니다.

지금은 오픈 소스 커뮤니티 쪽으로 방향을

틀고 있다고 봐야겠지요.

 

MS가 내놓은 GUI를 보면 뭔가 하나씩

빠진 듯한 느낌이 들 때가 있는데

이 회사는 지금도 그렇지만 처음부터

일부라도 오픈소스 정책이 아닌 것도

영향이 있다고 볼 수 있습니다.

 

win32 gui, MFC, winform, wpf, uwp

뭔가 많은데 미래를 위해서 딱히

이것을 배우라- 고 강추할만한

프레임워크는 없습니다.

그냥 주어진 상황에 적합한

프레임워크를 사용하면 됩니다.

 

윈도우 앱의 개발 역사가 오래되면서

아직도 수요가 많고 충성적인

사용자가 많은 것은 사실입니다.

비주얼 스튜디오를 사용하는 사람들은

이 툴을 계속 쓰게 되는데 그냥

오랫동안 MS가 독점해서 그런 것은 아니고

윈도우 시스템 사용자에게 매우 편리하고

강력한 IDE이기 때문입니다.

 

글로벌 IDE 순위를 매기는 TOP IDE INDEX에서

비주얼 스튜디오는 30%의 압도적인 점유율로

1위를 차지하고 있습니다. 비주얼 스튜디오가

출시한지 25년이 지났다는 것을 생각하면

대단한 성과입니다. 역시 MS는 잘 만든다 -

좋게 평가할 수 있습니다.

 

윈도우 데스크탑 앱의 개발은 비주얼 스튜디오가

가장 옵션이 많습니다. 위에 나열한 프레임워크들은

모두 비주얼 스튜디오에서 개발했을 때 가장 편리합니다.

 

하지만 너무 뭐가 많다보니 선택이 어려운데요.

 

특정 업무 환경이 아니라 자유롭게 앱을 개발한다면

여러 제품을 테스트해보고 선택하는 것도 나쁘지 않습니다.

 

WPF 앱

해서 오늘은 WPF 앱을 시작해보겠습니다.

본격적인 개발은 유행하는 디자인 패턴을

적용하는게 좋습니다. 하지만 그 전에

WPF가 자신의 성향에 맞는지 주력 언어와

상성이 좋은지 알아보는 것은 (찍먹해보는 것은)

시간적 낭비까지는 아닐 것 입니다.

어떤 프레임워크라도 마스터까지는 많은

시간이 소요되기 때문에 똥인지 된장인지

때로는 찍먹도 필요합니다. (잘못 먹으면 탈나니까)

 

- 비주얼 스튜디오

비주얼 스튜디오의 .NET 데스크탑 개발 요소를

설치하면 WPF 앱에 아래의 템플릿이 설치됩니다.

 

WPF 애플리케이션과 WPF 앱(.NET Framework)라고

두가지의 선택지가 있는데 딱 봐도 이상하지요?

 

크로스 플랫폼을 지원하는 .NET Core 의 WPF가 있고

그냥 Windows Presentation Foundation

- WPF 앱(.NET Framework)이 있습니다.

 

.NET Framework는 윈도우 전용이고 .NET Core는

리눅스, MacOS, Android 에 사용가능한

크로스 플랫폼입니다.

 

그럼 .NET Core WPF는 리눅스에도 실행이 되는가?

안됩니다. 그래서 WPF 애플리케이션이 Windows 라고

표시되어 있는 것이구요.

 

오픈소스라는 것은 맞습니다. 윈도우 환경에서

사용할 수 있는 오픈소스입니다.

리눅스에서 윈도우 프로그램을 실행하는

Wine 프로그램을 사용하면 리눅스에서도

WPF의 실행이 가능하다고 합니다.

(결국 가상머신인가... 의미없다;;;)

 

그런데 왜 WPF 앱과 두개가 나와서

선택장애가 있는 사람들을 힘들게 하는가?

 

MS의 기술문서(MSDN)에는 .NET Framework는

유지보수는 하지만 향후 새로운 기능을

업데이트할 계획이 없다고 합니다.

그러니 장기적으로 뭘 만들건 간에

.NET Core 로 넘어가라는 뜻 입니다.

 

약간 확대해석하면 혹시 나중에라도

.NET Core 가 확장되면 WPF를

리눅스나 MacOS에서 사용하도록

구현할 수도 있다 - 는 늬앙스도 느껴집니다.

또 오픈소스니까 누군가 리눅스 용으로

빌드할지 또 모르는 거니까요.

 

MS 프로젝트 중에는 자신들이 개발하다가

뭔가 잘 안되면 오픈 소스 커뮤니티에 넘기기도

하는데요. 예를 들어 최근에 튜토리얼을 몇개 만든

.NET 의 Monogame 은 최초에 MS사의

XNA 프로젝트였습니다.

(XBOX 360과 PC게임용 프레임워크)

그런데 이게 잘 안되었는지 지원을 포기하고

오픈 소스 커뮤니티에 넘긴 후 monogame이

되었고 MS는 monogame 을 사용해서

윈도우 게임앱을 개발하기도 합니다.

(MS사의 유튜브 쇼에서 monogame 을 소개하기도 함)

뭐 어차피 자기들이 시작한 프레임워크이고

XNA 네임스페이스를 그대로 사용하므로

당연한 것이지만 그런 것을 보면

MS도 많이 변했다는 생각이 듭니다.

 

다시 WPF에 대해서는...

한국은 WPF가 그 정도로 대중적이진 않는데

해외 C# 커뮤니티에서는 Winform이냐

WPF냐 UWP냐 논쟁이 좀 있습니다.

 

한 소프트웨어 기업이 이런 논쟁을

만들었다는 사실은 오픈 소스 쪽에서 보면

좀 불쾌하게 느껴질 수 있습니다.

오픈소스 진영에는 수십년 동안 개발되고

안정된 GUI 프레임워크가 많이 있습니다.

 

QT 같은 경우 1990년대에 시작된 프레임워크로

버전업에 따라 몇가지 변경은 있었지만

수십년째 기본틀을 유지하고 있습니다.

 

크로스 플랫폼에는 수십년째 그대로

잘 사용하고 있는 GUI 프레임워크가 많습니다.

 

wxWidgets 이나 파이썬의 tkinter,

GTK 는 C++, 파이썬으로도 사용가능하고

암튼 오픈소스 쪽에서는 MS 제품들에

비호감도가 있는데 단순한 반감보다는

MS사의 단종 정책도 영향이 있습니다.

뭘 한번 배우면 오래 써먹지 못하게 하니까

어떻게 보면 살기 위한 이유도 있습니다.

 

IT 커뮤니티에서는 아직도 Win API, MFC를

배워야하냐는 질문이 올라오기도 하는데

Win For, WPF, UWP에 관한 논쟁도

비슷한 부분이 있습니다.

커뮤니티가 아니라 MS사의 향후 지원여부에

달려있는데 그건 MS 윈도우 사용자들이

계속 유지되야 가능한 것이니까요.

 

일단 MS도 과거 100% Closed Source에서

방향을 많이 틀어서 가고 있으니까

WPF 는 윈도우 전용임에도 .NET Core로

빼놓은 것도 언젠가는 리눅스와 MacOS

환경의 사용이 늘어날 것이다 - 는

약간의 가능성은 남겨둔게 아닌가 싶습니다.

 

WPF 애플리케이션 CLI 설치

이 포스팅에서는 비주얼 스튜디오가 아니라

CLI 설치 후 비주얼 스튜디오 코드에서

WPF 윈도우를 실행해 보겠습니다.

 

첫번째로 할 일은 WPF 템플릿이

설치되어 있는지 확인합니다.

CMD에서 다음 .NET CLI 명령어를 입력합니다.

dotnet new --list

 

 

.NET Core 개발환경이 없으면

.NET SDK를 설치해야 합니다.

 

.NET Downloads (Linux, macOS, and Windows) (microsoft.com)

 

가장 최근의 LTS 는 .NET 6.0 입니다.

 

wpf 앱을 위한 폴더를 만들고

다음 명령어를 실행합니다.

dotnet new wpf

처음 만들면 폴더에 템플릿 파일이 생성됩니다.

[.]                  [..]                 App.xaml             App.xaml.cs
AssemblyInfo.cs      MainWindow.xaml      MainWindow.xaml.cs   [obj]
WpfApp1.csproj

이제 비주얼 스튜디오 코드에서

폴더를 오픈합니다.

 

MainWindow.xaml 파일은...

웹의 HTML 과 비슷합니다.

xml 문법을 사용해서 xaml 이라는

마크업 언어를 쓰는데요.

태그의 이름과 속성만 봐도

대충 무슨 의미인지 알 수 있습니다.

 

이 부분을 수정하여 Hello WPF를 출력해보겠습니다.

<Grid> 태그안에 <TextBlock>을 추가합니다.

<Window x:Class="WpfAppTut.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:WpfAppTut"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="72">
        Hello WPF!
        </TextBlock>

    </Grid>
</Window>

 

실행은 cmd에서 dotnet run MainWindow.xaml.cs 입니다.

 

 

비주얼 스튜디오로 만드는게 더 편하겠지만

CLI와 비주얼 스튜디오 코드를

사용하면서 IDE에서 자동으로 만드는 부분을

직접 타이핑 해보면서 좀 더 많은 코드를

체크할 수 있어서 가끔 해보기도 합니다.

또 용량 문제로 비주얼 스튜디오를

안쓰는 경우도 있으니까요.

(비주얼 스튜디오는 최소 10기가가

넘는 용량이 필요하다)

xaml 예제

UI 디자인을 위해서 xaml 을 사용하게 되는데요.

 

사실 이 xaml 은 UI디자이너가 wysiwyg

에디터에서 사용하도록 고안된 것 으로

웹으로 비유하면 프론트엔드(front-end)라고

할 수 있습니다. 프론트엔드라는 position이

생긴 역사가 짧기 때문에 UI디자이너라는

용어가 맞지는 않을 수도 있습니다만,

어쨋든 최종사용자가 사용하는

UI를 담당하는 거니까 전통적인

프로그램과는 차이가 있습니다.

 

프로그램 로직에 특화된 사람과

UI를 잘 만드는 사람이 다릅니다.

 

코드는 어렵지 않은데 디자인이 어렵다면?

그건 정상이니까 크게 걱정할 필요는 없다고 봅니다.

 

물론 WPF라는 것은 디자인을 몰라도

적당히 레이아웃을 배치하면 괜찮게 보입니다. 

 

예제를 통해서 xaml 이 어떤 언어인지

감을 한번 잡아 보겠습니다.

 

Button 은 웬만한 GUI 프레임워크에서

다 있는 객체입니다. xaml에서는 Button 을

Control 이라고 부릅니다. 

 

콘트롤에는 속성(Property)가 있습니다.

콘트롤에 속성을 부여하고 WPF에서

로드하면 그게 GUI 가 됩니다.

 

<grid> 태그 안에 아래와 같이 콘트롤을 만들어 봅니다.

 

        <Button>
            <Button.Content>Nice Button</Button.Content>
            <Button.Height>50</Button.Height>
            <Button.Width>100</Button.Width>
            <Button.FontSize>15</Button.FontSize>
        </Button>

아래와 같은 나이스한 버튼이 생성됩니다.

 

디테일한 내용은 아직 알 필요가 없습니다만,

Button 의 속성을 보면 대충 의미를 알 수 있습니다.

 

xaml 의 Button Control을 MainWindow.xaml.cs 에서

C# 코드로 구현해보면 아래와 같습니다.

 

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 WpfAppTut
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            Grid grid = new Grid();
            this.Content = grid;
            // grid.VerticalAlignment = VerticalAlignment.Center;

            Button btn1 = new Button();
            btn1.Content = "nice Button";
            btn1.Height = 50;
            btn1.Width = 100;
            btn1.FontSize = 15;

            grid.Children.Add(btn1);
        }
    }
}

 

즉 xaml을 사용하지 않아도 C#으로 만 WPF 앱을

만들 수 있다는 말입니다. 디자인과 코드가 분리되지

않은게 올드한 스타일이긴 한데 어차피 작은 프로젝트는

Wisiwig 에디터를 쓰면 큰 차이를 모를 수 있습니다.

 

WPF 는 MVVM 패턴을 중심으로 구현되었는데

xaml 은 주로 view 쪽의 분리와 데이타 바인딩을

처리해 주는 역할을 합니다.

 

해서 C# 소스코드에 직접 코드를 쓰는 것을

말리지는 않지만 그럴거면 WPF를 쓸 필요가 없다

차라리 WinForm을 써라 - 고 하는 사람들

때문에 서로 싸우기도 하던데...

이런 식의 뷰와 모델의 분리는 WPF만

있는 것은 아니니까 너무 어렵게 생각할

필요까지는 없다고 봅니다.

(JavaFX의 fxml, QT의 qml들을 보면)

프로젝트의 규모나 가용 인력 등 에 따라

정해지는 것이니까요.

 

마무리

잡다하게 WPF에 대해 알아봤습니다. 

지금 WPF에 발을 담궈도 되나

이런 고민은 각자 상황에 달려 있습니다.

 

개인적 의견은 C#과 비주얼 스튜디오를

주로 사용한다면 쓸만한 것 같습니다.

 

그런데 크로스 플랫폼이 아니고

진정한 업데이트가 언제 이루어질지도

모른다는 것은 조금 회의적이기도 합니다.

 

MS사는 윈도우 11과 10의 앱을 위해

또 다시 Windows App SDK라는

새로운 도구를 개발중에 있습니다.

이번에는 C#과 .NET, Win32 API 등

기존의 모든 프레임워크를 통합할 

프로젝트라고 하는데 나중에까지

WPF가 살아남는지는 지켜봐야할 듯합니다.

 

참고링크

Windows 앱 SDK를 사용하여 데스크톱 Windows 앱 빌드 - Windows apps | Microsoft Docs

 

Windows 앱 SDK를 사용하여 데스크톱 Windows 앱 빌드 - Windows apps

Windows 앱 SDK, 개발자에게 제공되는 혜택, 현재 개발자에게 준비된 사항 및 피드백 제공 방법에 대해 알아봅니다.

docs.microsoft.com

 

 

Windows Presentation Foundation의 개념 - WPF .NET | Microsoft Docs

 

What is Windows Presentation Foundation - WPF .NET

This article gives an overview of WPF with .NET Core and .NET 5.

docs.microsoft.com

TOP IDE index (pypl.github.io)

 

TOP IDE Top Integrated Development Environment index

TOP IDE Top Integrated Development Environment

pypl.github.io

데스크톱용 .NET의 새로운 기능 | Microsoft Docs

 

데스크톱용 .NET의 새로운 기능

.NET, .NET과 .NET Framework의 차이점, 추가된 새로운 기능에 관해 알아봅니다.

docs.microsoft.com

Building Games with MonoGame - YouTube

공유하기

facebook twitter kakaoTalk kakaostory naver band