2020년 7월 1일 수요일

WPF - Window

윈도우는 프로그램이 보이는 부분에서 가장 기초되는 부분이다. Object 를 상속하며, WPF 의 여러 클래스를 내부에 넣어서 프로그램을 완성시킨다. 긱 기능들을 살펴보자.


잘쓰는 속성


Title : 창 제목에 나올 이름이다.
Height, Width : 창 크기이다. 물리적 픽셀이 아니라 화면에 나오는 크기 기준이다.
Icon : 경로 넣으면 아이콘 바뀜
Topmost : 다른 프로그램으로 포커스 바꿔도 안꺼지고 화면 맨 위에 남아 있음.

Activate() (코드 상에서) : 포커스 상태로 만든다.
Close() (코드 상에서) : 윈도우를 종료한다.

Owner : 자식 윈도우를 만들 때 이걸 this. 로 넣으면 WindowStartupLocation="CenterOwner" 로 쓸 수 있어 좋다.

윈도우의 단계

1
2
3
4
5
6
7
8
9
10
11
12
13
<Window x:Class="Ex3.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:Ex3"
        mc:Ignorable="d"
        Title="Window Ex" Height="300" Width="400"
        Activated="Window_Activated"
        Deactivated="Window_Deactivated"
        Closing="Window_Closing"
        Closed="Window_Closed"
        >
cs

Activated - Application 의 Activated 후에 실행된다.
DeActivated - 마찬가지.
Closing - 윈도우를 닫기 전에 호출된다.
Closed - 윈도우를 닫고 나서 호출된다.

위처럼 해당되는 부분에 이벤트 핸들러를 넣으면 원하는 시점에 함수를 실행할 수 있다.

Window의 Application 의 종속성


1
2
3
4
5
6
7
8
9
private void btnNew_Click(object sender, RoutedEventArgs e)
{
    cnt++;
    Window win = new Window();
    win.Title = "새 창" + cnt.ToString();
    win.Height = 400;
    win.Width = 400;
    win.Show();
}
cs


위처럼 Window 를 생성하면 Application.Current.Windows 에 모두 모여있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
private void menuWindow_SubmenuOpened(object sender, RoutedEventArgs e)
{
    menuWindow.Items.Clear();
    foreach (Window win in Application.Current.Windows)
    {
        if (win == this) continue;
        if (win.Title == "") continue;

        MenuItem item = new MenuItem();
        item.Header = win.Title;
        item.Tag = win;
        item.Click += Item_Click;

        menuWindow.Items.Add(item);

        if (this.activeWindow != null && this.activeWindow == win)
            item.IsChecked = true;
        else
            item.IsChecked = false;
    }
}

private void Item_Click(object sender, RoutedEventArgs e)
{
    Window w = ((Window)((MenuItem)sender).Tag);
    ((MenuItem)sender).IsChecked = true;
    w.Activate();
    activeWindow = w;
}
cs


위는 생성된 Window 를 Menu 의 Items 으로 집어넣는 예이다.

Application.Current.Windows 를 어떻게 쓰는지를 중점으로 보면 된다.


나머지는

activateWindow 라는 변수에 Activate 인 윈도우를 넣어서 MenuItem 의 check 상태를 조절한다.


Tag 를 이용해 데이터를 전달하는 건 c# 의 주요한 테크닉이다.







댓글 없음:

댓글 쓰기

List