첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170

ElementHost 컨트롤의 PropertyMap 속성을 사용하여 Windows Forms 속성을 호스팅된 WPF 엘리먼트의 해당 속성에 매핑하는 방법을 보여준다.

TestProject.zip
0.04MB

▶ 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
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요