using System;
using System.Globalization;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
namespace TestProject
{
/// <summary>
/// 커스텀 비주얼 호스트
/// </summary>
public class CustomVisualHost : FrameworkElement
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 자식 비주얼 컬렉션
/// </summary>
private VisualCollection childCollection;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Property
////////////////////////////////////////////////////////////////////////////////////////// Proteced
#region 비주얼 자식 카운트 - VisualChildrenCount
/// <summary>
/// 비주얼 자식 카운트
/// </summary>
protected override int VisualChildrenCount
{
get
{
return this.childCollection.Count;
}
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - CustomVisualHost()
/// <summary>
/// 생성자
/// </summary>
public CustomVisualHost()
{
this.childCollection = new VisualCollection(this);
this.childCollection.Add(GetRectangleDrawingVisual());
this.childCollection.Add(GetTextDrawingVisual());
this.childCollection.Add(GetEllipseDrawingVisual());
MouseLeftButtonUp += FrameworkElement_MouseLeftButtonUp;
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Protected
//////////////////////////////////////////////////////////////////////////////// Function
#region 비주얼 자식 구하기 - GetVisualChild(index)
/// <summary>
/// 비주얼 자식 구하기
/// </summary>
/// <param name="index">인덱스</param>
/// <returns>비주얼</returns>
protected override Visual GetVisualChild(int index)
{
if(index < 0 || index >= this.childCollection.Count)
{
throw new ArgumentOutOfRangeException();
}
return this.childCollection[index];
}
#endregion
////////////////////////////////////////////////////////////////////////////////////////// Private
//////////////////////////////////////////////////////////////////////////////// Event
#region 프레임워크 엘리먼트 마우스 왼쪽 버튼 UP 처리하기 - FrameworkElement_MouseLeftButtonUp(sender, e)
/// <summary>
/// 프레임워크 엘리먼트 마우스 왼쪽 버튼 UP 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void FrameworkElement_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
Point mousePoint = e.GetPosition(this);
VisualTreeHelper.HitTest
(
this,
null,
new HitTestResultCallback(FrameworkElementHitTestResultCallback),
new PointHitTestParameters(mousePoint)
);
}
#endregion
//////////////////////////////////////////////////////////////////////////////// Function
#region 사각형 그리기 비주얼 구하기 - GetRectangleDrawingVisual()
/// <summary>
/// 사각형 그리기 비주얼 구하기
/// </summary>
/// <returns>사각형 그리기 비주얼</returns>
private DrawingVisual GetRectangleDrawingVisual()
{
DrawingVisual drawingVisual = new DrawingVisual();
DrawingContext drawingContext = drawingVisual.RenderOpen();
Rect rectangle = new Rect
(
new Point(160, 100),
new Size(320, 80)
);
drawingContext.DrawRectangle(Brushes.LightBlue, (Pen)null, rectangle);
drawingContext.Close();
return drawingVisual;
}
#endregion
#region 텍스트 그리기 비주얼 구하기 - GetTextDrawingVisual()
/// <summary>
/// 텍스트 그리기 비주얼 구하기
/// </summary>
/// <returns>텍스트 그리기 비주얼</returns>
private DrawingVisual GetTextDrawingVisual()
{
DrawingVisual drawingVisual = new DrawingVisual();
DrawingContext drawingContext = drawingVisual.RenderOpen();
drawingContext.DrawText
(
new FormattedText
(
"Click Me!",
CultureInfo.GetCultureInfo("en-us"),
FlowDirection.LeftToRight,
new Typeface("Verdana"),
36,
Brushes.Black
),
new Point(200, 116)
);
drawingContext.Close();
return drawingVisual;
}
#endregion
#region 타원 그리기 비주얼 구하기 - GetEllipseDrawingVisual()
/// <summary>
/// 타원 그리기 비주얼 구하기
/// </summary>
/// <returns></returns>
private DrawingVisual GetEllipseDrawingVisual()
{
DrawingVisual drawingVisual = new DrawingVisual();
DrawingContext drawingContext = drawingVisual.RenderOpen();
drawingContext.DrawEllipse
(
Brushes.Maroon,
null,
new Point(430, 136),
20,
20
);
drawingContext.Close();
return drawingVisual;
}
#endregion
#region 프레임워크 엘리먼트 히트 테스트 결과 콜백 처리하기 - FrameworkElementHitTestResultCallback(result)
/// <summary>
/// 프레임워크 엘리먼트 히트 테스트 결과 콜백 처리하기
/// </summary>
/// <param name="result">히트 테스트 결과</param>
/// <returns>히트 테스트 결과 동작</returns>
private HitTestResultBehavior FrameworkElementHitTestResultCallback(HitTestResult result)
{
if(result.VisualHit.GetType() == typeof(DrawingVisual))
{
if(((DrawingVisual)result.VisualHit).Opacity == 1.0)
{
((DrawingVisual)result.VisualHit).Opacity = 0.4;
}
else
{
((DrawingVisual)result.VisualHit).Opacity = 1.0;
}
}
return HitTestResultBehavior.Stop;
}
#endregion
}
}