티스토리 뷰
1. 메인 화면 구성
아래 이미지와 같이 1개의 Window를 2개의 영역으로 분할해서 사용 합니다.
Kiosk 개발을 할 때 대부분 이렇게 1개의 윈도우에 화면을 분할해서 왼쪽 영역은 고객이 사용하고, 오른쪽 영역은 관리자가 사용 한다고 합니다.
최종 실행 화면
MainWindow.xaml
<Window
x:Class="PrismKiosk.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
Title="{Binding Title}"
Width="1920"
Height="1080"
prism:ViewModelLocator.AutoWireViewModel="True">
<Grid>
<Grid.ColumnDefinitions>
<!-- 키오스크 화면 영역 -->
<ColumnDefinition Width="640" />
<!-- 간격 -->
<ColumnDefinition Width="10" />
<!-- 관리자 화면 영역 -->
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<ContentControl prism:RegionManager.RegionName="KioskContentRegion" />
<ContentControl Grid.Column="2" prism:RegionManager.RegionName="ManagerContentRegion" />
</Grid>
</Window>
Prism의 Region을 이용해서 1개의 화면을 2개로 분리하도록 만들었습니다.
Region에 대한 자세한 설명은 여기를 참고하시기 바랍니다.
2. KioskContentRegion 영역에 출력할 Intro 화면 생성 및 연결
- Views 폴더 아래 KioskIntro라는 이름의 UserControl을 추가 합니다.
- ViewModels 폴더에 KioskIntroViewModel이라는 이름의 클래스를 추가합니다.
KioskIntro.xaml
<UserControl
x:Class="PrismKiosk.Views.KioskIntro"
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:local="clr-namespace:PrismKiosk.Views"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:prism="http://prismlibrary.com/"
d:DesignHeight="450"
d:DesignWidth="800"
prism:ViewModelLocator.AutoWireViewModel="True"
mc:Ignorable="d">
<Grid>
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="30"
Text="Intro" />
</Grid>
</UserControl>
이렇게 수정합니다.
prism:ViewModelLocator.AutoWireViewModel="True"
KioskIntro라는 화면이 생성되면 자동으로 ViewModels 폴더아래에 있는 KioskIntroViewModel을 생성해서 DataContext에 입력합니다.
ViewModelBase.cs
모든 뷰모델에서 사용하는 공통 프로퍼티나 커맨드들을 가지는 뷰모델베이스를 하나 만들어 줍니다.
/// <summary>
/// 뷰모델 베이스
/// </summary>
public abstract class ViewModelBase : BindableBase
{
/// <summary>
/// 컨테이터 프로바이더
/// </summary>
protected IContainerProvider ContainerProvider;
private bool _isBusy;
/// <summary>
/// IsBusy
/// </summary>
public bool IsBusy
{
get { return _isBusy; }
set { SetProperty(ref _isBusy, value); }
}
/// <summary>
/// 기본 생성자
/// </summary>
public ViewModelBase()
{
}
/// <summary>
/// 런타임 생성자
/// </summary>
/// <param name="containerProvider"></param>
public ViewModelBase(IContainerProvider containerProvider)
{
ContainerProvider = containerProvider;
}
}
Prism 최신 버전은 생성자 주입(Constructor Injection)만 지원하고 있습니다.
즉, Container에서 ViewModel이 생성이될 때 containerProvider를 주입해서 생성하게 됩니다. 주입된 containerProvider는 상송받은 뷰모델에서 접근할 수 있도록 protected field를 만들어서 연결합니다.
생성자에서 주입된 항목들은 readonly 속성을 추가해서 사용하면 좋습니다.
protected readonly IContainerProvider ContainerProvider;
KioskIntroViewModel.cs
ViewModelBase만 상속받은 간단한 뷰모델을 생성합니다.
/// <summary>
/// 키오스크 인트로 뷰모델
/// </summary>
public class KioskIntroViewModel : ViewModelBase
{
public KioskIntroViewModel()
{
}
public KioskIntroViewModel(IContainerProvider containerProvider) : base(containerProvider)
{
}
}
2. Type등록
KioskIntro라는 화면은 KioskContentRegion 이라는 곳에 Navigate가 되어야 합니다. 이렇게 Navigate가 되어야하는 화면은 미리 등록을 해야합니다.
App.xaml.cs
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
//RegionNavigation을 사용할 화면을 등록
containerRegistry.RegisterForNavigation<KioskIntro>();
}
3. RegionNavigate
앱이 시작되면 MainWindow가 가장 먼저 인스턴스되서 실행됩니다.
MainWindow는 인스턴스된 후에 다른 동작이 없기 때문에, 런타임 생성자에서 각 Region마다 시작 화면을 지정합니다.
MainWindowViewModel.cs
/// <summary>
/// 런타임 생성자
/// </summary>
/// <param name="containerProvider"></param>
public MainWindowViewModel(IContainerProvider containerProvider) : base(containerProvider)
{
var regionManager = ContainerProvider.Resolve<IRegionManager>();
//2개의 리즌에 시작할 화면 지정
regionManager.RegisterViewWithRegion("KioskContentRegion", "KioskIntro");
}
이렇게하고 실행하면 MainWindow 왼쪽에 Intro 라는 글씨가 뜨는 것을 볼 수 있습니다.
위에서 작업한 대로 ManagerLogin 화면을 만들면 됩니다.
작업을 완료하신 후 실행하면 맨 처음 이미지와 동일한 화면을 보실 수 있습니다.
4. 소스
GitHub - kaki104/PrismKiosk at Part1/init-default-settings
'WPF .NET' 카테고리의 다른 글
Prism - ContentControl에 화면 생성해서 넣기 1/2 (2) | 2023.10.19 |
---|---|
Kiosk 만들기 - Part2 (0) | 2023.10.18 |
Kiosk 만들기 - Part0 (0) | 2023.10.13 |
CommunityToolkit.Mvvm Login 페이지 추가하고 사용 (0) | 2023.07.24 |
Url 유효성 체크 (0) | 2023.05.22 |
- Total
- Today
- Yesterday
- LINQ
- C#
- Build 2016
- #prism
- #MVVM
- .net 5.0
- PRISM
- Microsoft
- uno-platform
- MVVM
- Cross-platform
- Visual Studio 2022
- kiosk
- Bot Framework
- WPF
- XAML
- visual studio 2019
- ef core
- UWP
- windows 11
- Always Encrypted
- ComboBox
- uno platform
- #uwp
- .net
- Windows 10
- dotNETconf
- Behavior
- IOT
- #Windows Template Studio
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 30 | 31 |