GSI

사용자 삽입 이미지

Win Form 에서 WPF 를 추가 해서 사용할때는 ElementHost를 사용합니다.
자세한 내용은 Win Form 에 WPF 컨트롤 붙이기 를 참고 하시구요.

그렇다면 이제 반대로 WPF 에서 Win Form을 추가 해서 쓰고 싶을때는 어떻게 할까 고민해보니.
WindowsFormsHost 라는 객체를 이용하면 처리가 되네요.

<Grid>
    <my:WindowsFormsHost ... />
</Grid>

이렇게 xaml 코드를 추가한 후에 cs 파일에서 추가를 아래와 같이 합니다.

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    WindowsFormsControlLibrary1.UserControl1 uc =
        new WindowsFormsControlLibrary1.UserControl1();

    windowsFormsHost1.Child = uc;
}

중점 사항

  • UserControl 클래스를 추가 해서 사용해야 합니다. 즉, userControl 의 dll 파일을 참조 추가 해서
    사용해야 한다는 말이죠.
  • WPF 에서 Win Form의 UserControl의 객체를 접근하기 위해서는 노출이 되어 있지 않기 때문에 게터 메소드를 하나 만들어서 해야 합니다.
    예)  public string TextValue { get { return textBox1.Text; } }
  • 위의 게터 메소드가 노출되어 있다면 아래와 같이 WPF를 통해서 값을 참조할 수 있네요.
    예) WindowsFormsControlLibrary1.UserControl1 uc =
            (WindowsFormsControlLibrary1.UserControl1)windowsFormsHost1.Child;
         textBox1.Text = uc.TextValue;

다른 몇가지 사항에 대해서는 더 테스트를 해보지 않았습니다.
우선 자세한 코드는 아래 파일을 보세요.
더 자세한 사항이나 기타 의논하고 싶으신 부분 있으시면 언제든 연락 부탁 해요.

관련 파일:


Posted by gsi
:

사용자 컨트롤 배경 투명색으로 처리 하기

이 부분은 뒷 배경을 투명으로 바꾸기는 하지만 Flicker 처리가 되지 않아서
이동시 잔상이 생기게 되네요.

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace transcontroldemo
{
 /// <summary>
 /// Summary description for TransPanel.
 /// </summary>
 public class TransPanel : Panel
 {
  public TransPanel()
  {
   //
   // TODO: Add constructor logic here
   //
  }

  protected override CreateParams CreateParams
  {
   get
   {
    CreateParams cp = base.CreateParams;
    cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT
    return cp;
   }
  }

  protected void InvalidateEx()
  {
   if (Parent == null)
    return;

   Rectangle rc = new Rectangle(this.Location, this.Size);
   Parent.Invalidate(rc, true);
  }

  protected override void OnPaintBackground(PaintEventArgs pevent)
  {
   //do not allow the background to be painted
  }

  protected override void OnResize(EventArgs eventargs)
  {
   this.InvalidateEx();
  }

  Random r = new Random();
  protected override void OnPaint(PaintEventArgs e)
  {
   int h = this.Height / 2;
   int w = this.Width;

   Pen p = new Pen(Color.White, 2);
   e.Graphics.DrawLine( p,  0,h, w, 0);
   p.Dispose();
  }
 }
}


Posted by gsi
:

커스텀 컨트롤 EventHandler 등록하기

사용자 컨트롤을 추가한 후에 EventHandler 를 추가하고 나면 Form에 추가한 컨트롤에서
사용자가 입력한 변수 및 이벤트를 처리할 수 있습니다.
바로 아래 코드는 이벤트 핸들러 처리 코드 입니다.

private string prefix = "";
public event EventHandler PrefixChanged;

public string Prefix
{
    get { return this.prefix; }
    set {
        this.prefix = value;
   
        //PrefixChanged 이벤트를 발생시킨다.
        if (this.PrefixChanged != null)
        {
            PrefixChanged(this, EventArgs.Empty);
        }
        this.Invalidate();
    }
}

Posted by gsi
: