결과적으로 Slider는 2~40 사이의 범위 안에서 정수를 반환해 주게 됩니다.
이것은 0.5 단위의 Stroke Size를 얻어내기 위해서 사용한 꼼수 입니다. (주석 참조)
이벤트가 2가지 보이는데,
ValueChanging은 사용자가 Slider의 Handle을 잡고 움직이는 동안(MouseMove)에도 이벤트가 발생하고,
ValueChanged는 사용자가 Slider를 움직이다가 손을 때었을 때(MouseLeftButtonUp) 이벤트가 발행합니다.
void _oSizeSlider_ValueChanged(object sender, EventArgs e)
{
// 스트로크 사이즈를 업데이트
StokeSize = GetStrokeSizeFromSlider();
// 이벤트 발생
OnSizeChanged();
}
그럼, StokeSize 프로퍼티의 set을 살펴보면 값이 할당되면 동적으로 어떤 일들을 하는지 보실 수 있습니다.
// Outline Thickness 고려
_elSize.Width = _dStrokeSize + 4;
_elSize.Height = _dStrokeSize + 4;
_elSize.SetValue(Canvas.LeftProperty, (_cvCurSize.Width - _elSize.Width) / 2);
_elSize.SetValue(Canvas.TopProperty, (_cvCurSize.Height - _elSize.Height) / 2 - 3);
_tbSize.Text = string.Format("{0:F1}", _dStrokeSize);
_tbSize.SetValue(Canvas.LeftProperty, (_cvCurSize.Width - _tbSize.ActualWidth) / 2);
}
}
4. 샘플 프로젝트에 적용
Page.xaml을 Blend에서 Open 합니다.
Asset Library를 통해서 UCStrokeSize User Control을 Page.xaml에 추가합니다.
(만약 모르시는 부분이면 다음 포스트를 먼저 읽으십시오. http://gilverlight.net/2674)
SizeChanged 이벤트를 구현해 줍니다.
팔레트의 색상이 변경될 때마다 Stroke Size Controler에서도 자기가 보여주고 있는
Stroke 미리보기의 색상을 변경해 줍니다.
이제 Stroke Size Controler 추가가 끝났습니다.
전에 없던 MouseEnter 이벤트를 추가합니다.
// InkPresenter Mouse Event 필수 4종세트
_ink.MouseLeftButtonDown += new MouseEventHandler(ink_MouseLeftButtonDown);
_ink.MouseMove += new MouseEventHandler(ink_MouseMove);
_ink.MouseEnter += new MouseEventHandler(_ink_MouseEnter);
_ink.MouseLeftButtonUp += new MouseEventHandler(ink_MouseLeftButtonUp);
_ink.MouseLeave += new EventHandler(ink_MouseLeave);
}
void _ink_MouseEnter(object sender, MouseEventArgs e)
{
if (_bDrawContinue == true)
{
StartNewStroke(e.GetStylusPoints(_ink));
}
}
_bDrawContinue의 값을 MouseLeftButtonDown에서 true, MouseLeftButtonUp에서 false로 설정합니다.
_ink.CaptureMouse();
StartNewStroke(e.GetStylusPoints(_ink));
_bDrawContinue = true;
}
void ink_MouseLeftButtonUp(object sender, MouseEventArgs e)
{
_ink.ReleaseMouseCapture();
_strokeCurrent = null;
_bDrawContinue = false;
}
이렇게 하면 그리는 도중 영역 밖을 나갔다 들어와도 계속해서 그림이 그려집니다.
이것으로 이번 강좌를 마칩니다.
감사합니다.
Tag : InkPresenter, RIA, Silverlight, Stroke, 방명록만들기, 실버라이트, 웹, 휴즈플로우
Tag : ColorPalette, InkPresenter, RIA, Silverlight, UserControl, 방명록만들기, 실버라이트, 웹
Tag : InkPresenter, RIA, Silverlight, UserControl, 방명록만들기, 실버라이트, 웹
Tag : InkPresenter, Redo, RIA, Silverlight, Undo, 방명록만들기, 실버라이트, 웹
오늘은 아래와 같은 Sample 예제를 만드는 과정을 설명하고자 합니다.
샘플을 작동해보실 수 있는 모델하우스 :
http://www.shiverlight.net/InkPresenterSample/InkPresenterSample
1. Page.xaml
Xaml은 Expression에서 다음과 같이 디자인을 했습니다.
Tag : InkPresenter, RIA, Silverlight, Stroke, 방명록만들기, 실버라이트, 웹
올해 마지막 당일치기 예비군 훈련 다녀왔습니다. ^^
1) InkPresenter XAML
일단 위와 같이 간단하게 두 획을 그은 경우를 예를 들어 설명을 드리겠습니다.
기본적으로 InkPresenter 객체는 배경색을 주지 않으면 투명하게 존재합니다.
즉, 동영상(MediaElement)이나 사진(Image)을 배경으로 구현하는 것도 가능하다는 것입니다.
위 그림에 대한 XAML을 살펴 보겠습니다.
<InkPresenter Width="190" Height="190" Background="#FFB7E31D">
<InkPresenter.Strokes>
<Stroke>
<Stroke.DrawingAttributes>
<DrawingAttributes Color="#FFFFFFFF" Width="9" Height="9"/>
</Stroke.DrawingAttributes>
<Stroke.StylusPoints>
<StylusPoint X="70" Y="75"/>
<StylusPoint X="71" Y="75"/>
<StylusPoint X="71" Y="76"/>
<StylusPoint X="72" Y="76"/>
<StylusPoint X="72" Y="77"/>
<StylusPoint X="73" Y="78"/>
<StylusPoint X="74" Y="79"/>
<StylusPoint X="74" Y="80"/>
<StylusPoint X="75" Y="81"/>
</Stroke.StylusPoints>
</Stroke>
<Stroke>
<Stroke.DrawingAttributes>
<DrawingAttributes Color="#FF000000" Width="9" Height="9"/>
</Stroke.DrawingAttributes>
<Stroke.StylusPoints>
<StylusPoint X="85" Y="83"/>
<StylusPoint X="85" Y="82"/>
<StylusPoint X="86" Y="81"/>
<StylusPoint X="87" Y="80"/>
<StylusPoint X="88" Y="79"/>
<StylusPoint X="90" Y="78"/>
<StylusPoint X="90" Y="77"/>
</Stroke.StylusPoints>
</Stroke>
</InkPresenter.Strokes>
</InkPresenter>
InkPresenter는 Stroke들의 Collection이라고 보시면 되구요.
Stroke는 한 획이라고 보시면 됩니다. (= 한 번의 클릭으로 그려지는 단위)
한 Stroke는 DrawingAttributes와 StylusPoints로 이루어 집니다.
DrawingAttributes를 통해 Ink의 Width, Height와 Color를 설정할 수 있습니다.
StylusPoints는 마우스 움직이는 동안에 일정 Frequency로 샘플링된 점들의 집합이라고 보시면 됩니다.
타블렛에서 스타일러스를 사용해서 그리게 되면 좀더 많은 점을 샘플링하기 때문에 부드러운 그림이 그려지게 됩니다.
주의) 위 XAML코드는 Expression Blend에서 Invalid XAML 에러가 납니다.
하지만 실행시켜보면 화면에는 정상적으로 보여집니다. 버그일까요?
2) Expression Blend에서 InkPresenter 객체 추가하기
Visual Studio의 XAML 코드편집창에 <InkPresenter> 태그를 직접 입력해서 추가하시거나.
C# 코드로 동적으로 생성하셔도 되지만, 뭐니뭐니해도 Blend를 써서 하는게 디자인하기는 편하겠죠!
A. Expression Blend를 실행시키고 왼쪽의 세로 Toolbar의 맨 아래쪽 Asset Library 버튼을 누릅니다. B. 오른쪽 위에 있는 Show All 체크 박스를 체크하시고, InkPresenter를 선택합니다. C. 왼쪽 세로 ToolBar에 InkPresenter 아이콘이 추가된 모습을 확인하실 수 있습니다. D. InkPresenter 아이콘을 클릭하고 Rectangle이나 Canvas를 추가하듯 추가합
구피
정말 잘만드셨네요
| 2008/02/27 12:02 | PERMALINK | EDIT | REPLY |디자인도 너무 깔끔해...ㅠㅠ요
안녕하세요! 길버트 이길복입니다.
| 2008/02/28 00:11 | PERMALINK | EDIT | REPLY |그렇게 말씀해 주시니 감사합니다!
강좌를 아직 마무리 짓지 않아서 죄송할 따름입니다.