728x90
728x170
▶ BlueColor.xaml
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<SolidColorBrush x:Key="NormalBackgroundSolidColorBrushKey" Color="Blue" />
</ResourceDictionary>
728x90
▶ BlueSize.xaml
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<CornerRadius x:Key="NormalCornerRadiusKey">0</CornerRadius>
</ResourceDictionary>
▶ RedColor.xaml
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<SolidColorBrush x:Key="NormalBackgroundSolidColorBrushKey" Color="Red" />
</ResourceDictionary>
300x250
▶ RedSize.xaml
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<CornerRadius x:Key="NormalCornerRadiusKey">10</CornerRadius>
</ResourceDictionary>
▶ BorderStyle.xaml
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="BorderStyleKey" TargetType="Border" >
<Setter Property="Background" Value="{StaticResource NormalBackgroundSolidColorBrushKey}" />
<Setter Property="CornerRadius" Value="{StaticResource NormalCornerRadiusKey}" />
</Style>
</ResourceDictionary>
▶ Skin.cs
namespace TestProject
{
/// <summary>
/// 스킨
/// </summary>
public enum Skin
{
/// <summary>
/// 적색
/// </summary>
Red,
/// <summary>
/// 청색
/// </summary>
Blue
}
}
▶ MainApplication.xaml
<Application x:Class="TestProject.MainApplication"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary />
</Application.Resources>
</Application>
▶ MainApplication.xaml.cs
using System;
using System.Windows;
namespace TestProject
{
/// <summary>
/// 메인 애플리케이션
/// </summary>
public partial class MainApplication : Application
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Property
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region 스킨 - Skin
/// <summary>
/// 스킨
/// </summary>
public static Skin Skin { get; set; } = Skin.Red;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Instance
//////////////////////////////////////////////////////////////////////////////// Public
#region 스킨 변경하기 - ChangeSkin(Skin skin)
/// <summary>
/// 스킨 변경하기
/// </summary>
/// <param name="skin">스킨</param>
public void ChangeSkin(Skin skin)
{
Skin = skin;
Resources.Clear();
Resources.MergedDictionaries.Clear();
if(Skin == Skin.Blue)
{
AddBlueSkin();
}
else if(Skin == Skin.Red)
{
AddRedSkin();
}
AddBorderStyle();
}
#endregion
//////////////////////////////////////////////////////////////////////////////// Protected
#region 시작시 처리하기 - OnStartup(e)
/// <summary>
/// 시작시 처리하기
/// </summary>
/// <param name="e">이벤트 인자</param>
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
ChangeSkin(Skin.Red);
}
#endregion
//////////////////////////////////////////////////////////////////////////////// Private
#region 리소스 딕셔너리 추가하기 - AddResourceDictionary(uri)
/// <summary>
/// 리소스 딕셔너리 추가하기
/// </summary>
/// <param name="uri">URI</param>
private void AddResourceDictionary(string uri)
{
Resources.MergedDictionaries.Add
(
new ResourceDictionary()
{
Source = new Uri(uri, UriKind.Relative)
}
);
}
#endregion
#region 청색 스킨 추가하기 - AddBlueSkin()
/// <summary>
/// 청색 스킨 적용하기
/// </summary>
private void AddBlueSkin()
{
AddResourceDictionary("RESOURCE/BlueColor.xaml");
AddResourceDictionary("RESOURCE/BlueSize.xaml" );
}
#endregion
#region 적색 스킨 추가하기 - AddRedSkin()
/// <summary>
/// 적색 스킨 추가하기
/// </summary>
private void AddRedSkin()
{
AddResourceDictionary("RESOURCE/RedColor.xaml");
AddResourceDictionary("RESOURCE/RedSize.xaml" );
}
#endregion
#region 테두리 스타일 추가하기 - AddBorderStyle()
/// <summary>
/// 테두리 스타일 추가하기
/// </summary>
private void AddBorderStyle()
{
AddResourceDictionary("RESOURCE/BorderStyle.xaml");
}
#endregion
}
}
▶ MainWindow.xaml
<Window x:Class="TestProject.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="800"
Height="600"
Title="ResourceDictionary 클래스 : 컴파일 및 동적 스키닝 사용하기"
FontFamily="나눔고딕코딩"
FontSize="16">
<Grid>
<StackPanel
HorizontalAlignment="Center"
VerticalAlignment="Center">
<Border Name="border"
Style="{DynamicResource BorderStyleKey}"
Width="300"
Height="300" />
<StackPanel
HorizontalAlignment="Center"
Margin="0 10 0 0"
Orientation="Horizontal">
<Button Name="blueSkinButton"
Width="100"
Height="30"
Content="청색 스킨" />
<Button Name="redSkinButton"
Margin="10 0 0 0"
Width="100"
Height="30"
Content="적색 스킨" />
</StackPanel>
</StackPanel>
</Grid>
</Window>
▶ MainWindow.xaml.cs
using System.Windows;
namespace TestProject
{
/// <summary>
/// 메인 윈도우
/// </summary>
public partial class MainWindow : Window
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - MainWindow()
/// <summary>
/// 생성자
/// </summary>
public MainWindow()
{
InitializeComponent();
this.blueSkinButton.Click += blueSkinButton_Click;
this.redSkinButton.Click += redSkinButton_Click;
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Private
#region 청색 스킨 버튼 클릭시 처리하기 - blueSkinButton_Click(sender, e)
/// <summary>
/// 청색 스킨 버튼 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void blueSkinButton_Click(object sender, RoutedEventArgs e)
{
(Application.Current as MainApplication).ChangeSkin(Skin.Blue);
}
#endregion
#region 적색 스킨 버튼 클릭시 처리하기 - redSkinButton_Click(sender, e)
/// <summary>
/// 적색 스킨 버튼 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void redSkinButton_Click(object sender, RoutedEventArgs e)
{
(Application.Current as MainApplication).ChangeSkin(Skin.Red);
}
#endregion
}
}
728x90
그리드형(광고전용)
'C# > WPF' 카테고리의 다른 글
[C#/WPF] VisualBrush 엘리먼트 : 해시 패턴 사용하기 (0) | 2022.01.09 |
---|---|
[C#/WPF] FrameworkElement 클래스 : GDI+를 사용해 텍스트 블럭 만들기 (0) | 2022.01.09 |
[C#/WPF] x:ClassModifier 속성 사용하기 (0) | 2022.01.09 |
[C#/WPF] ResourceDictionary 클래스 : 느슨한 XAML 스키닝 사용하기 (0) | 2022.01.09 |
[C#/WPF] ResourceDictionary 클래스 : 컴파일 및 동적 스키닝 사용하기 (기능 개선) (0) | 2022.01.09 |
[C#/WPF] ResourceDictionary 클래스 : 컴파일 및 정적 스키닝 사용하기 (0) | 2022.01.09 |
[C#/WPF] DoubleAnimation 클래스 : 화면을 반짝이는 애니메이션 사용하기 (0) | 2022.01.09 |
[C#/WPF] TextBox 클래스 : KeyDown 이벤트를 사용해 ENTER 키를 누르는 경우 포커스 해제하기 (0) | 2022.01.08 |
[C#/WPF] 마이크로폰 볼륨 설정하기 (0) | 2022.01.08 |
[C#/WPF] 정렬과 필터링 가능한 데이터 가상화 사용하기 (0) | 2022.01.06 |