728x90
반응형
728x170
ElementHost 컨트롤의 PropertyMap 속성을 사용하여 Windows Forms 속성을 호스팅된 WPF 엘리먼트의 해당 속성에 매핑하는 방법을 보여준다.
▶ MainForm.cs
using System;
using System.Drawing;
using System.IO;
using System.Reflection;
using System.Windows;
using System.Windows.Forms;
using System.Windows.Forms.Integration;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace TestProject
{
/// <summary>
/// 메인 폼
/// </summary>
public partial class MainForm : Form
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - MainForm()
/// <summary>
/// 생성자
/// </summary>
public MainForm()
{
InitializeComponent();
Load += Form_Load;
Resize += Form_Resize;
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Private
//////////////////////////////////////////////////////////////////////////////// Event
#region 폼 로드시 처리하기 - Form_Load(sender, e)
/// <summary>
/// 폼 로드시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void Form_Load(object sender, EventArgs e)
{
System.Windows.Controls.Button button = new System.Windows.Controls.Button();
button.Content = "Windows Presentation Foundation Button";
this.elementHost.Child = button;
AddMarginPropertyMapping();
RemoveCursorPropertyMapping();
AddRegionPropertyMapping();
ExtendBackColorPropertyMapping();
this.elementHost.Margin = new Padding(30, 30, 30, 30);
this.elementHost.Region = new Region();
this.elementHost.BackColor = System.Drawing.Color.AliceBlue;
}
#endregion
#region 폼 크기 변경시 처리하기 - Form_Resize(sender, e)
/// <summary>
/// 폼 크기 변경시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void Form_Resize(object sender, EventArgs e)
{
ProcessRegionPropertyTranslator(this.elementHost, "Region", null);
}
#endregion
//////////////////////////////////////////////////////////////////////////////// Function
#region 마진 속성 번역자 처리하기 - ProcessMarginPropertyTranslator(hostObject, propertyName, value)
/// <summary>
/// 마진 속성 번역자 처리하기
/// </summary>
/// <param name="hostObject">호스트 객체</param>
/// <param name="propertyName">속성명</param>
/// <param name="value">값</param>
private void ProcessMarginPropertyTranslator(object hostObject, string propertyName, object value)
{
ElementHost elementHost = hostObject as ElementHost;
Padding padding = (Padding)value;
System.Windows.Controls.Button button = elementHost.Child as System.Windows.Controls.Button;
Thickness thickness = new Thickness(padding.Left, padding.Top, padding.Right, padding.Bottom);
button.Margin = thickness;
}
#endregion
#region 영역 속성 번역자 처리하기 - ProcessRegionPropertyTranslator(hostObject, propertyName, value)
/// <summary>
/// 영역 속성 번역자 처리하기
/// </summary>
/// <param name="hostObject">호스트 객체</param>
/// <param name="propertyName">속성명</param>
/// <param name="value">값</param>
private void ProcessRegionPropertyTranslator(object hostObject, string propertyName, object value)
{
ElementHost elementHost = hostObject as ElementHost;
System.Windows.Controls.Button button = elementHost.Child as System.Windows.Controls.Button;
button.Clip = new EllipseGeometry
(
new Rect
(
0,
0,
this.elementHost.Width - (button.Margin.Left + button.Margin.Right ),
this.elementHost.Height - (button.Margin.Top + button.Margin.Bottom)
)
);
}
#endregion
#region 배경색 속성 번역자 처리하기 - ProcessBackColorPropertyTranslator(hostObject, propertyName, value)
/// <summary>
/// 배경색 속성 번역자 처리하기
/// </summary>
/// <param name="hostObject">호스트 객체</param>
/// <param name="propertyName">속성명</param>
/// <param name="value">값</param>
private void ProcessBackColorPropertyTranslator(object hostObject, string propertyName, object value)
{
string assemblyFilePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string imageFilePath = Path.Combine(assemblyFilePath, "IMAGE", "sample.jpg");
ImageBrush imageBrush = new ImageBrush(new BitmapImage(new Uri(@"file:///" + imageFilePath)));
ElementHost elementHost = hostObject as ElementHost;
System.Windows.Controls.Button button = elementHost.Child as System.Windows.Controls.Button;
button.Background = imageBrush;
}
#endregion
#region 마진 속성 매핑 추가하기 - AddMarginPropertyMapping()
/// <summary>
/// 마진 속성 매핑 추가하기
/// </summary>
private void AddMarginPropertyMapping()
{
this.elementHost.PropertyMap.Add("Margin", new PropertyTranslator(ProcessMarginPropertyTranslator));
}
#endregion
#region 커서 속성 매핑 제거하기 - RemoveCursorPropertyMapping()
/// <summary>
/// 커서 속성 매핑 제거하기
/// </summary>
private void RemoveCursorPropertyMapping()
{
this.elementHost.PropertyMap.Remove("Cursor");
}
#endregion
#region 영역 속성 매핑 추가하기 - AddRegionPropertyMapping()
/// <summary>
/// 영역 속성 매핑 추가하기
/// </summary>
private void AddRegionPropertyMapping()
{
this.elementHost.PropertyMap.Add("Region", new PropertyTranslator(ProcessRegionPropertyTranslator));
}
#endregion
#region 배경색 속성 매핑 확장하기 - ExtendBackColorPropertyMapping()
/// <summary>
/// 배경색 속성 매핑 확장하기
/// </summary>
private void ExtendBackColorPropertyMapping()
{
if(this.elementHost.PropertyMap["BackColor"] != null)
{
this.elementHost.PropertyMap["BackColor"] += new PropertyTranslator(ProcessBackColorPropertyTranslator);
}
}
#endregion
}
}
728x90
반응형
그리드형(광고전용)
'C# > WinForm' 카테고리의 다른 글
[C#/WINFORM] ElementHost 클래스 : WPF 복합 컨트롤 호스트하기 (0) | 2023.01.01 |
---|---|
[C#/WINFORM] ElementHost 클래스 : WPF 복합 컨트롤 사용하기 (0) | 2023.01.01 |
[C#/WINFORM] RNGCryptoServiceProvider 클래스 : GetBytes 메소드를 사용해 임시 패스워드 생성기 만들기 (0) | 2022.11.05 |
[C#/WINFORM/.NET6] 이미지 RTF 구하기 (0) | 2022.10.30 |
[C#/WINFORM/.NET6] 마우스 이벤트 발생시키기 (0) | 2022.10.22 |
[C#/WINFORM/.NET6] Point 구조체 : 선의 왼쪽 포인트 여부 구하기 (0) | 2022.10.19 |
[C#/WINFORM/.NET6] 별점(Star Rating) 그리기 (0) | 2022.10.14 |
[C#/WINFORM/.NET6] 비주얼 스튜디오 2022에서 단일 실행 파일 배포하기 (0) | 2022.10.10 |
[C#/WINFORM/.NET6] ISynchronizeInvoke 인터페이스 : InvokeRequired 코드 패턴 자동화하기 (0) | 2022.10.09 |
[C#/WINFORM/.NET6] MethodInvoker 대리자 : InvokeRequired 코드 패턴 자동화하기 (0) | 2022.10.09 |
댓글을 달아 주세요