WPF 개발, 단순 컨트롤

WPF(Windows Presentation Foundation)는 강력한 GUI(그래픽 사용자 인터페이스) 개발 플랫폼으로,
.NET Framework의 일부로 제공됩니다. WPF의 주된 장점 중 하나는 데이터 바인딩, 2D/3D 그래픽, 비디오 및 비주얼 효과를
지원하며, 이러한 다양한 기능을 통해 개발자는 사용자 경험을 향상시키는 데 초점을 맞출 수 있습니다.
이 글에서는 WPF의 기본 컨트롤에 대해 자세히 알아보고, 이를 활용한 간단한 예제 코드를 제공하여
WPF 개발의 기초를 다져보겠습니다.

1. WPF 컨트롤의 이해

WPF에서 사용되는 컨트롤은 다양한 사용자 상호작용을 처리할 수 있는 UI 구성 요소입니다.
이들 컨트롤은 사용자가 애플리케이션과 상호작용하는 중요한 역할을 하며, 주로 다음과 같은 종류가 있습니다:

  • 기본 컨트롤: Button, TextBox, Label 등
  • 레이아웃 컨트롤: Grid, StackPanel, WrapPanel 등
  • 입력 컨트롤: ComboBox, ListBox, CheckBox, RadioButton 등
  • 선택 컨트롤: Slider, ProgressBar 등
  • 트리 및 그리드 컨트롤: TreeView, DataGrid 등

2. 기본 컨트롤의 사용

WPF의 기본 컨트롤을 사용하는 것은 애플리케이션 UI를 구성하는 첫 단계입니다.
각 컨트롤은 XAML(Extensible Application Markup Language)코드에서 선언되고,
C# 코드로 제어할 수 있습니다. 이제 가장 기본적인 컨트롤인 Button, TextBox, Label을 예로 들어 보겠습니다.

2.1 Button 컨트롤

Button은 사용자 클릭 이벤트를 처리할 수 있는 기본적인 컨트롤입니다.
클릭 시 특정 동작을 수행하도록 구현할 수 있습니다. 아래는 Button 컨트롤의 간단한 예제입니다.


<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="WPF Button Example" Height="200" Width="300">
    <Grid>
        <Button Name="myButton" Content="클릭하세요" Width="100" Height="30" Click="myButton_Click"/>
    </Grid>
</Window>

위 코드에서 Button은 “클릭하세요”라는 텍스트를 가지고 있으며, Click 이벤트가 발생할 시
myButton_Click라는 C# 메소드가 호출됩니다. 아래는 이를 처리하는 C# 코드입니다.


using System.Windows;

namespace WpfApp
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void myButton_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("버튼이 클릭되었습니다!");
        }
    }
}

2.2 TextBox 컨트롤

TextBox는 사용자가 텍스트를 입력할 수 있도록 하는 컨트롤입니다.
사용자의 입력을 받아 처리하는 데 유용합니다. 아래는 TextBox와 Button을 결합하여
사용자의 입력을 받아서 메시지 박스로 출력하는 예제입니다.


<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="WPF TextBox Example" Height="200" Width="300">
    <Grid>
        <TextBox Name="myTextBox" Width="200" Height="30" Margin="10"/>
        <Button Content="입력 확인" Width="100" Height="30" Margin="10" VerticalAlignment="Bottom" Click="myButton_Click"/>
    </Grid>
</Window>

위 버튼을 클릭하면 텍스트 박스에 입력한 내용을 메시지 박스로 출력하는 C# 코드는 다음과 같습니다.


private void myButton_Click(object sender, RoutedEventArgs e)
{
    string userInput = myTextBox.Text;
    MessageBox.Show($"입력한 내용: {userInput}");
}

2.3 Label 컨트롤

Label 컨트롤은 주로 텍스트를 표시하는 데 사용됩니다. 다른 컨트롤과 달리 사용자가 상호작용하기 위해 클릭할 수 없습니다.
Label은 UI 요소에 정보를 제공하는 데 유용합니다. 아래는 Label과 TextBox를 함께 사용하는 예제입니다.


<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="WPF Label Example" Height="200" Width="300">
    <Grid>
        <Label Content="이름을 입력하세요:" Margin="10"/>
        <TextBox Name="nameTextBox" Width="200" Height="30" Margin="10,30,10,10"/>
        <Button Content="확인" Width="100" Height="30" Margin="10,70,10,10" Click="checkButton_Click"/>
    </Grid>
</Window>

위 버튼을 클릭할 때의 C# 코드는 다음과 같습니다.


private void checkButton_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show($"입력한 이름: {nameTextBox.Text}");
}

3. 레이아웃 컨트롤

다양한 기본 컨트롤을 효과적으로 배치하기 위해 WPF는 여러 종류의 레이아웃 컨트롤을 제공합니다.
여기에서는 Grid, StackPanel, DockPanel, WrapPanel 등을 살펴보겠습니다.

3.1 Grid

Grid는 가장 유용한 레이아웃 컨트롤 중 하나로, 행과 열로 구성된 2차원 그리드 레이아웃을 만듭니다.
그리드에 컨트롤을 배치할 때 Row와 Column을 지정하여 원하는 위치에 컨트롤을 배치할 수 있습니다.


<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="WPF Grid Example" Height="200" Width="300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        
        <Label Content="이름:" Grid.Row="0" Grid.Column="0"/>
        <TextBox Name="nameTextBox" Grid.Row="0" Grid.Column="1"/>
        <Button Content="확인" Grid.Row="1" Grid.ColumnSpan="2" Click="checkButton_Click"/>
    </Grid>
</Window>

위 예제에서 행과 열을 정의하고 각 컨트롤이 위치할 곳을 지정하였습니다.
RowDefinition과 ColumnDefinition을 이용해 레이아웃을 커스터마이징할 수 있습니다.

3.2 StackPanel

StackPanel은 자식 요소를 수직 또는 수평으로 쌓는 단순한 레이아웃 컨트롤입니다.
아래 코드처럼 Orientation 속성을 사용하여 방향을 쉽게 설정할 수 있습니다.


<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="WPF StackPanel Example" Height="200" Width="300">
    <StackPanel Orientation="Vertical">
        <Label Content="이름:" />
        <TextBox Name="nameTextBox" />
        <Button Content="확인" Click="checkButton_Click" />
    </StackPanel>
</Window>

StackPanel은 구조가 간단하여 빠르게 UI를 구성할 수 있는 장점이 있습니다.

3.3 DockPanel

DockPanel은 자식 요소를 화면의 각 위치에 도킹할 수 있게 해주는 레이아웃 컨트롤입니다.
각 자식 요소는 Top, Bottom, Left, Right에 도킹할 수 있으며, 마지막 요소는 나머지 공간을 차지하게 됩니다.


<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="WPF DockPanel Example" Height="200" Width="300">
    <DockPanel>
        <Button Content="상단" DockPanel.Dock="Top" Click="checkButton_Click" />
        <Button Content="하단" DockPanel.Dock="Bottom" Click="checkButton_Click" />
        <Button Content="왼쪽" DockPanel.Dock="Left" Click="checkButton_Click" />
        <Button Content="오른쪽" DockPanel.Dock="Right" Click="checkButton_Click" />
        <Button Content="중앙" Click="checkButton_Click" />
    </DockPanel>
</Window>

DockPanel은 다양한 방향으로 요소를 배치할 수 있어 자유로운 레이아웃 구성이 가능합니다.

3.4 WrapPanel

WrapPanel은 자식 요소를 가로 방향으로 쌓고, 공간이 부족해지면 자동으로 다음 줄로 넘어가는
레이아웃 컨트롤입니다. 대량의 아이템이 있는 경우 유용하게 사용됩니다.


<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="WPF WrapPanel Example" Height="200" Width="300">
    <WrapPanel>
        <Button Content="버튼 1" Width="80" />
        <Button Content="버튼 2" Width="80" />
        <Button Content="버튼 3" Width="80" />
        <Button Content="버튼 4" Width="80" />
        <Button Content="버튼 5" Width="80" />
        <Button Content="버튼 6" Width="80" />
    </WrapPanel>
</Window>

WrapPanel은 많은 수의 버튼이나 아이콘을 유동적으로 배치하고자 할 때 특히 유용합니다.

4. 입력 컨트롤

WPF는 다양한 입력 컨트롤을 제공하여 사용자의 선택을 받을 수 있습니다.
ComboBox, ListBox, CheckBox, RadioButton 등의 입력 컨트롤에 대해 알아보겠습니다.

4.1 ComboBox

ComboBox는 드롭다운 목록에서 항목을 선택할 수 있게 해주는 컨트롤입니다.
사용자가 직접 입력할 수 있는 옵션을 제공하므로 유용합니다. 아래는
ComboBox를 사용하는 예제입니다.


<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="WPF ComboBox Example" Height="200" Width="300">
    <Grid>
        <ComboBox Name="myComboBox">
            <ComboBoxItem Content="옵션 1"/>
            <ComboBoxItem Content="옵션 2"/>
            <ComboBoxItem Content="옵션 3"/>
        </ComboBox>
        <Button Content="선택 확인" Click="myButton_Click" Width="100" Height="30" Margin="0,50,0,0"/>
    </Grid>
</Window>

사용자가 선택한 항목을 출력하는 C# 코드는 다음과 같습니다.


private void myButton_Click(object sender, RoutedEventArgs e)
{
    if (myComboBox.SelectedItem is ComboBoxItem selectedItem)
    {
        MessageBox.Show($"선택한 옵션: {selectedItem.Content}");
    }
}

4.2 ListBox

ListBox는 여러 항목을 나열하고 사용자가 원하는 항목을 선택할 수 있도록 해주는 컨트롤입니다.
선택할 수 있는 항목들을 목록 형태로 보여줄 수 있습니다. 아래는 ListBox를 사용하는 예제입니다.


<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="WPF ListBox Example" Height="200" Width="300">
    <Grid>
        <ListBox Name="myListBox">
            <ListBoxItem Content="항목 1"/>
            <ListBoxItem Content="항목 2"/>
            <ListBoxItem Content="항목 3"/>
        </ListBox>
        <Button Content="선택 확인" Click="myButton_Click" Width="100" Height="30" Margin="0,50,0,0"/>
    </Grid>
</Window>

ListBox에서 선택한 항목을 확인하는 C# 코드는 다음과 같습니다.


private void myButton_Click(object sender, RoutedEventArgs e)
{
    if (myListBox.SelectedItem is ListBoxItem selectedItem)
    {
        MessageBox.Show($"선택한 항목: {selectedItem.Content}");
    }
}

4.3 CheckBox와 RadioButton

CheckBox는 사용자가 여러 옵션 중에서 하나 이상을 선택할 수 있도록 해주며,
RadioButton은 여러 옵션 중에서 하나만 선택할 수 있도록 합니다. 이 두 컨트롤의 사용 예제는 다음과 같습니다.


<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="WPF CheckBox & RadioButton Example" Height="200" Width="300">
    <StackPanel>
        <CheckBox Name="checkBox1" Content="옵션 1"/>
        <CheckBox Name="checkBox2" Content="옵션 2"/>
        
        <RadioButton Name="radioButton1" Content="단일 선택 1"/>
        <RadioButton Name="radioButton2" Content="단일 선택 2"/>
        
        <Button Content="확인" Click="checkButton_Click" />
    </StackPanel>
</Window>

사용자가 선택한 옵션을 확인하는 C# 코드는 다음과 같습니다.


private void checkButton_Click(object sender, RoutedEventArgs e)
{
    string checkedItems = $"선택한 CheckBox: {(checkBox1.IsChecked == true ? checkBox1.Content : "")} {(checkBox2.IsChecked == true ? checkBox2.Content : "")}";
    string selectedRadio = radioButton1.IsChecked == true ? radioButton1.Content.ToString() : radioButton2.Content.ToString();
    
    MessageBox.Show($"{checkedItems}\n선택한 RadioButton: {selectedRadio}");
}

5. 이벤트 및 데이터 바인딩

WPF에서는 이벤트를 통해 사용자 상호작용을 처리하고, 데이터 바인딩을 통해 UI와 데이터간의 동기화를 유지할 수 있습니다.
이를 통해 Видимуюинтерфейс와 데이터의 통신을 보다 간편하게 수행할 수 있습니다.
다음 예제에서는 간단한 데이터 바인딩을 보여줍니다.

5.1 데이터 바인딩

데이터 바인딩은 WPF의 핵심 기능 중 하나로, UI 요소와 데이터 소스를 연결하여
데이터의 변화를 UI에 자동으로 반영할 수 있는 기능입니다.
아래는 ListBox와 TextBlock을 사용한 데이터 바인딩의 예입니다.


<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="WPF Data Binding Example" Height="200" Width="300">
    <StackPanel>
        <ListBox Name="myListBox" SelectedItem="{Binding SelectedItem}" />
        <TextBlock Text="{Binding SelectedItem, ElementName=myListBox}" />
    </StackPanel>
</Window>

ViewModel을 작성하고 바인딩할 데이터를 설정하면, ListBox에서 선택된 항목이 TextBlock에 자동으로 표시됩니다.


using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;

namespace WpfApp
{
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        public ObservableCollection Items { get; set; }
        private string _selectedItem;

        public string SelectedItem
        {
            get { return _selectedItem; }
            set
            {
                _selectedItem = value;
                OnPropertyChanged("SelectedItem");
            }
        }

        public MainWindow()
        {
            InitializeComponent();
            Items = new ObservableCollection { "아이템 1", "아이템 2", "아이템 3" };
            DataContext = this;
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

결론

WPF는 다양한 기본 컨트롤, 레이아웃 컨트롤 및 데이터 바인딩 기능을 통해 강력한 UI 애플리케이션을 제작할 수 있는 플랫폼입니다.
이 글에서는 WPF의 단순 컨트롤을 소개하고, 각각의 컨트롤을 어떻게 활용할 수 있는지에 대한 예제를 제공하였습니다.
기본 컨트롤을 포함한 WPF의 다양한 기능을 탐색하고 활용하면, 더욱 풍부한 사용자 경험을 제공하는 애플리케이션을 개발할 수 있습니다.
WPF에 대한 지속적인 탐구와 실습을 통해 더욱 정교한 애플리케이션을 작성할 수 있을 것입니다.

앞으로 이 글이 WPF 개발에 도움이 되길 바랍니다.
각 컨트롤의 특성과 사용법을 숙지하고, 실습을 통해 보다 깊은 이해를 얻어가시기 바랍니다.
성공적인 WPF 개발의 여정을 응원합니다!