만들어보았다

[WPF] 추첨을 통해 사람과 메뉴 고르기 (C#)

Solu- 2021. 4. 22. 12:03

개요

매 점심마다 무엇을 먹을지 고민하는 게 참 어려운 일이다. 같이 공부하는 사람과 상의해서 정하곤 하는데, 매번 상의해서 정하는 것도 시간적 소요가 있다.

그래서 졸업작품을 했던 기억을 더듬어, C#과 WPF를 이용해 사람 목록메뉴 목록을 입력 받고 그 중에 한가지씩을 골라 알려주는 프로그램을 만들었다.

창은 1개만 구현했고, 결과는 MessageBox를 통해 알려주기로 한다.

코드

MainWindow.xaml

<Window x:Class="WpfApp1.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:getLunch"
        mc:Ignorable="d"
        Title="MainWindow" Height="800" Width="600">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="3*"/>
            <RowDefinition Height="2*"/>
            <RowDefinition Height="2*"/>
            <RowDefinition Height="1*"/>
            <RowDefinition Height="5*"/>
            <RowDefinition Height="5*"/>
            <RowDefinition Height="2*"/>
            <RowDefinition Height="1*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="2*"/>
            <ColumnDefinition Width="4*"/>
            <ColumnDefinition Width="1*"/>
        </Grid.ColumnDefinitions>
        <TextBlock Grid.ColumnSpan="3" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center" Text="메뉴 추첨기" FontSize="42"/>

        <TextBlock Grid.Column="0" Grid.Row="1" FontFamily="D2Coding" HorizontalAlignment="Right" VerticalAlignment="Center" FontSize="28">
            이름 :
        </TextBlock>
        <TextBox Grid.Column ="1" Grid.Row="1" Name="InputPeople" FontSize="28" KeyDown="InputPeople_KeyDown"/>

        <TextBlock Grid.Column="0" Grid.Row="2" FontFamily="D2Coding" HorizontalAlignment="Right" VerticalAlignment="Center" FontSize="28">
            메뉴 :
        </TextBlock>
        <TextBox Grid.Column ="1" Grid.Row="2" Name="InputMenu" FontSize="28" KeyDown="InputMenu_KeyDown"/>

        <TextBlock Grid.Column="0" Grid.Row="4" FontFamily="D2Coding" HorizontalAlignment="Right" VerticalAlignment="Center" FontSize="26">
            추첨대상 :
        </TextBlock>
        <ListBox Grid.Column="1" Grid.Row="4" Name="ListPeople" FontSize="14"/>

        <TextBlock Grid.Column="0" Grid.Row="5" FontFamily="D2Coding" HorizontalAlignment="Right" VerticalAlignment="Center" FontSize="26">
            추첨메뉴 :
        </TextBlock>
        <ListBox Grid.Column="1" Grid.Row="5" Name="ListMenu" FontSize="14"/>

        <TextBlock Grid.ColumnSpan="2" Grid.Row="7" FontFamily="D2Coding" VerticalAlignment="Center">
            2021.04.22 : 메뉴 추첨기!
        </TextBlock>

        <Button Grid.Column="1" Grid.Row="6" Name="GetBtn" Content="추첨!" FontSize="28" Click="GetBtn_Click"/>
    </Grid>
</Window>

화면 구성은 다음과 같다.

MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Input;

namespace getLunch
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// 사람과 메뉴 입력을 받고 그 중에 하나를 추첨해서 반환함
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void GetBtn_Click(object sender, RoutedEventArgs e)
        {
            // 추첨 함수

            // 사람, 메뉴 리스트에서 데이터를 다 가져옴
            List<string> allListPeople = new List<string>();
            List<string> allListMenu = new List<string>();

            foreach (string input_items in ListPeople.Items)
            {
                allListPeople.Add(input_items);
            }

            foreach (string input_items in ListMenu.Items)
            {
                allListMenu.Add(input_items);
            }

            // 리스트가 비어있는건 아닌지 확인
            if (allListPeople.Count == 0)
            {
                // 사람 입력이 없을 경우
                MessageBox.Show("입력된 사람이 없습니다.", "사람 리스트 오류", MessageBoxButton.OK);
            }
            else if (allListMenu.Count == 0)
            {
                // 메뉴 입력이 없을  경우
                MessageBox.Show("입력된 메뉴가 없습니다.", "메뉴 리스트 오류", MessageBoxButton.OK);
            }
            else
            {
                // 뽑힌 사람, 메뉴의 index를 추첨 (random)
                Random r = new Random();
                int choicePeople = r.Next(0, allListPeople.Count);
                int choiceMenu = r.Next(0, allListMenu.Count);

                // 당첨 결과 출력
                MessageBox.Show("\"" + allListPeople[choicePeople] + "\" 님이 \"" + allListMenu[choiceMenu] + "\" 로 안내하세요!!", "축) 당첨", MessageBoxButton.OK);
            }

        }

        private void InputMenu_KeyDown(object sender, KeyEventArgs e)
        {
            // 메뉴를 입력 받아서 ListMenu에 넣어줌
            String menu;

            switch (e.Key)
            {
                case Key.Enter:
                    menu = InputMenu.Text;
                    ListMenu.Items.Add(menu);
                    InputMenu.Text = "";    // textbox의 내용 초기화
                    break;
                default:
                    break;
            }
        }

        private void InputPeople_KeyDown(object sender, KeyEventArgs e)
        {
            // 메뉴를 입력 받아서 ListPeople에 넣어줌
            String people;

            switch (e.Key)
            {
                case Key.Enter:
                    people = InputPeople.Text;
                    ListPeople.Items.Add(people);
                    InputPeople.Text = "";  // textbox의 내용 초기화
                    break;
                default:
                    break;
            }
        }
    }
}

위의 이름과 메뉴 옆의 TextBox에서 입력한 후 엔터를 입력하면, 아래의 ListBox에 해당 내용을 추가하는 구조로 되어 있다.
그 후에 추첨 Button을 누르면 ListBox의 값들을 가져와서, 그 중에 한가지씩을 골라서 반환한다.

TextBox의 이벤트에 각각 InputPeople_KeyDown()InputMenu_KeyDown()을 추가했다. 동작 방식은 동일하기 때문에, sender를 통해 이벤트를 통합 할 수도 있겠다.

Button의 이벤트에는 GetBtn_Click()을 사용했는데, List<string>에 리스트의 모든 값을 다 담아둔 뒤, 0 ~ List.Count 까지의 값 중에 하나를 반환하여 조회, 출력한다.

별도의 창을 구성하는 것 보다, MessageBox를 이용하는 것이 더욱 간편하여 결과를 알려주었다.

혹시나 메뉴나 사람이 입력되지 않았을 경우를 대비해, 리스트가 비었을 경우 추첨을 진행하지 않는다.

소감

졸업작품 때 WPF를 이용하여 tts를 출력했는데, 오랜만에 WPF와 C#을 이용하여 즐거운 경험이었다. 기본에 충실한 디자인이지만 잘 작동하는 게 뿌듯하다.