WPF2009/08/12 18:13

안녕하세요. 김대욱입니다. 최근들어 터치스크린을 이용한 프로젝트를 자주 진행하다보니 이번 포스팅은 터치스크린을 이용하는 시스템에서 유용하게 사용될 수 있는 내용이 되겠습니다. 이번시간에 소개해 드릴 내용은 터치스크린을 사용하는 어플리케이션에서 TextBox등의 Control에 Focus 되었을때 자동으로 Screen Keyboard Application을 실행하는 예제입니다. 동영상을 보시면 쉽게 이해하실수 있습니다.



위 동영상에서는 WIndows에서 기본적으로 제공하는 OnScreenKeyboard를 사용했지만, 이번시간에 소개해 드릴 내용을 응용하면 직접 개발한 Keyboard Application을 사용하실 수도 있습니다. 간단하게 원리를 말씀드리자면 입력가능한 컨트롤 즉, TextBox나 PasswordBox에 Focus 되었을때 미리 지정해놓은 Keyboard Application을 실행하고 Focus를 잃었을때 Keyboard Application을 닫는 원리가 되겠습니다.

컨트롤 하나하나 일일이 Focus이벤트 코드를 추가하는 방법을 사용할수도 있겠지만, 이번시간에 소개해 드릴방법은 Attached DependencyProperty를 사용하여 간단하게 Screen Keyboard를 지원하도록 구현했습니다. 사용할때에는 아래와 같이 사용할 수 있습니다.


아래는 Attached DependencyProperty를 구현한 소스코드입니다.

동작원리는 위에서 설명드린것과 동일하며 Attached Dependency Property를 이해하고 있다면, 어렵지 않게 이해하실수 있을것 같습니다 ^^ 이상으로 이번 포스팅을 마치며 질문의나 문의 사항은 언제든지 연락주시기 바랍니다 ^^ 감사합니다.

소스코드입니다.


저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
WPF2009/07/28 03:14

안녕하세요. 김대욱입니다. 자기전에 포스팅 하나 하고자야겠다 싶어 새벽 포스팅 시작합니다. ㅎㅎ

이번시간에 소개해 드릴 내용은 WPF를 이용해 아래와 같이 문자열로 이루어진 이미지를 만드는 방법입니다. 제목은 조금 거창하게 ASCII Art라고 소개했지만 일정 공백을 두고 픽셀 정보를 가져와 이를 문자열로 바꾸기만하면되는.. 매우 간단한 예제가 되겠습니다...(낚시 제목.. ㅈㅅ)  아래 사진속 고양이는 저희집에서 저와 함께 살고 있는 쿠루 입니다 +_+



위 그림에서 보시다 시피 이미지를 입력하면 해당이미지를 문자로만 이루어진 이미지로 변환 하기 때문에 폰트 크기가 작으면 작을 수록 원본이미지와 유사한 이미지로 나타나는 것을 확인 하실 수 있습니다. 구현 방법 소개에 앞서 동영상을 보면서 어떻게 동작하는지 한번 생각해보시기 바랍니다~!! 동영상 캡쳐할때 화질이 좋지 못해서 색상이 이상하게 표현되네요 ㅠㅠ ㅋ 화질좋고 빠른 동영상 캡쳐 툴 있으면 추천해주세요~!~!



사실 이번시간에서의 중요한 대부분의 코드는 XAML보다는 C#코드로 되어있습니다. 설명은 주석에 적어놨으니 참고하시길 바라며 아래는 이미지의 경로를 입력하면 임의의 문자열과 적합한 색상값을 갖는 객체를 추출 하는 작업에 대한 코드입니다.

코드자체가 어렵진 않기때문에 이해하시는 데에는 큰 무리가 없을것으로 생각되며, 제가 이번시간에 ASCII ART예제를 준비하면서 말씀드리고 싶은 중요한 내용은 BmpBitmapEncoder를 이용해서 간단하게 PixelData를 가져올수 있다~!~! 라는것입니다. 예전에 System.Drawing.Bitmap객체를 활용해서 Pixel Data를 접근 방법에 대해 소개해 드린적이있지만, Bitmap Class는 WPF에서 기본적으로 사용하는 Class가 아니기때문에 Reference를 추가하는 등에 작업이 필요합니다, 하지만BmpBitmapEncoder와 MemoryStream을 사용하면 위 작업을 하지 않아도 PixelData에 접근이 가능하기 때문에 이번 예제와 같은 내용을 개발하실 때 상당히 유용할것 같습니다. (단, 위 방법을 사용하실 경우 수정시 원본이미지에 반영 되지는 않습니다..)

나머지 위 코드를 호출하는 부분등은 아래 첨부한 소스코드를 보시면 확인하실수 있습니다. 기타 질문이나 문의 요청사항은 이메일이나 리플 오른쪽 포스팅 소제 제공을 통해 문의 하시면 되겠습니다 ^^

PS. 제작할때 폰트를 굴림체, 돋움체, 궁서체 등 모든 문자의 크기가 동일한 폰트를 활용하면 굳~~~~ 입니다.




저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
TAG c#, WPF, XAML, 쿠루
WPF2009/07/11 21:03
안녕하세요. 김대욱입니다. 방금전에 세미나를 끝마치고 돌아왔습니다 ..
생각보다 많은 분들께서 참석을 해주셔서 조금 당황하긴 했지만 다행히 특별한 사고 없이 끝난것 같아 다행이네요 ^^;
사전준비가 철저하지 못해 다소 미흡했던 부분들이 있었다면 너그럽게 이해 해주셨으면 감사하겠습니다.(__) 꾸벅.
세미나에 참석하지 않으셨거나, 혹은 참석하셨지만, 샘플 소스 CD를 받지 못하신 분들을 위해 샘플 소스 CD이미지 (ISO로 되어있습니다.)를 올려드립니다. 블로그에 등록된 내용이거나 기존 내용에서 좀더 사용하기 쉽도록 변경한 코드들이 포함되어 있습니다.



용량이 생각보다 큰 관계로 3개로 분할압축하여 업로드 했습니다. 압축은 ALZ 포멧으로 압축되어 있으며 알집등으로 압축을 푸시면 ISO이미지를 확인하실 수 있습니다. 이외 세미나때 질문하지 못했던 부분이나, 기타 다른 질문은 이메일, 방명록,리플 등등등 다양한 방법으로 연락주시면 답변드리도록 하겠습니다.


P.S 질의응답 시간에 제가 답변을 보류했던 내용에 대해서는 정확한 테스트 작업을 거쳐 빠른 시일내에 포스팅 하도록 하겠습니다 ^^


저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
WPF2009/06/12 02:56
안녕하세요. 지구온난화로 인해 어쩌고저쩌고 해서 날씨가 개떡같음을 한탄하는 1人 김대욱입니다. -_-;; ㅋㅋ
최근들어 WPF를 이용해 CubeUI를 구현하는 방법에 대해 문의하시는 분들이 많아 이번시간에는 Cube UI를 WPF의 ListBox에 적용하여 이를 구현는 방법에 대해 소개해 드리고자 합니다..!!  아래는 구현 완료 동영상 입니다.



동영상만 봐서는 저게 뭐에다가 쓰이는 물건인지.. 감이 안잡히시죠??  (제목을 보셨다면 이해 하셨을수도.. ㅎㅎ) 이번시간에 구현할 내용은 WPF3D를 이용해 기존의 Listbox를 Cube모양으로 만들어 활용하는 방법에 대해 소개해 드리겠습니다. 먼저 구조에대해 설명을 드리겠습니다. (소스코드를 다운로드 받으셔서 확인해 가시면서 보시면 이해가 빠를것 같습니다!)

프로젝트를 열어보면 위 샘플에 사용된 이미지 몇장과 Cube3D.xaml, CubeListBox.xaml이 있습니다.
Cube3D.xaml은 Cube UI이기 때문에 Cube 모양을 정의 하는 Geometry가 포함된 ModelVisual3D객체 입니다. Cube3D에는 Front, Back, Left, Right, Top, Bottom이라 이름의 Property가 존재하는데요, 이는 Cube의 각각 면에 해당하는 합니다.

그리고 OffsetX, OffsetY, OffsetZ ... RotationZ 등은 제가 WPF를 이용해서 3D를 구현할때 자주사용하는 코드로 간단하게 Offset, Scale, Rotation을 적용하기 위한 코드입니다. 이부분은 다음에 더 자세히 다루도록 하겠습니다.

그다음 CubeListBox입니다. CubeListBox는 위에서 말씀드린 Cube3D를 템플릿에 활용하여 구현된 ListBox입니다. Template부분 코드를 보면 아래와 같습니다.




Viewport3D를 이용해 WPF3D를 사용하기 위한 Viewport를 생성하고 적당한 카메라와 조명의 위치를 잡은 뒤 위에서 말씀드렸던Cube3D객체를 추가합니다. 그리고 각면에 SelectedItem, PrevItem, NextItem등을 Binding하게되는데요.
여기서 Front에 SelectedItem을 Left에 PrevItem을, Right에 NextItem을 Binding하는 이유는 잠시후에 설명하도록 하겠습니다.
(SelectedItem은 사용자가 현재 ListBox에서 선택한 객체를 보여주고, PrevItem는 이전 NextItem은 다음 객체를 의미합니다.)

PrevItem과 NextItem은 Listbox에 기본적으로 정의된 Property가 아니기 때문에 새로 Dependency Property로 정의 하고, SelectedIndex가 변경되었을때 아래와 같은 내용으로 PrevItem과, NextItem에 값을 할당 해줍니다.

ListBox에 추가된 객체의 갯수보다 Nextndex가 클경우 Index를 0으로 설정하여 순환구조로 작성했으며 PrevIndex가 0보다 작을경우 마지막 항목의 Index를 지정하여 마찬가지로 순환구조를 가지도록 했습니다.

이렇게 하면 Cube상에 현재 선택된 객체는 Front에 다음 객체는 Right에 이전객체는 Left에 위치하게 됩니다. 이제 마우스 조작을 통해 큐브를 회전시키는 부분을 구현할 건데요...해당코드는 아래와 같습니다.


Cube를 회전 한다고해서 실제 ListBox의 SelectedIndex가 변경되는것이 아니기 때문에 회전 Animation이 완료되면 회전 방향에 따라 Index를 증가 또는 감소 시켜줍니다.

이렇게하면 Front에는 현재 선택된 객체가, Left에는 이전, Right에는 다음 객체가 보여지게 되는데요. 회전을 하게되면 Cube자체의 Front, Left, Right 면의 위치가 변하게 되어 뜻하지 않은 결과를 발생시킵니다. 이를 위해 Cube의 회전이 모두 끝나면 Animation을 제거하여 큐브가 회전하지 않은 상태가 되도록 합니다.

이렇게 구현된 CubeListBox는 아래와 같이 일반적인 ListBox와 같은 방식으로 사용하실 수 있습니다.




이상으로 이번 포스팅을 마치며 기타 질문이나 문의 포스팅 요청은 이메일이나 리플로 남겨제요 ^^
아래는 이번 시간에 작업한 내용의 전체 소스코드입니다.





저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
WPF2009/05/14 11:09

안녕하세요. 김대욱입니다. 거의 한달만에 포스팅이네요 >_< 포스팅 할 내용을 적어놓은 메모장에는 자꾸 늘어나는데..
현재 진행하고있는 프로젝트 마감때문에 정신이 하나도 없어서 포스팅을 재때 못하고 있습니다 ㅠ_ㅠ 이해해주세요 (굽신굽신)

이번시간에는 얼마전 포스팅에서 소개해드린바있는 Fixed Image Control(http://whatisthat.co.kr/150)를 WPF의 Attatched Dependency Property를 사용하여 어떤 컨트롤에나 적용될 수 있는 PixelSnapper를 구현해 보도록 하겠습니다. 아래는 시연동영상 입니다.



먼저 간단하게 Attatched DependencyProperty에 대해 설명을 드리자면, 우리가 일반적으로 사용하는 Button라는 객체가 있을때 Button에는 Animation이라는 Property가 존재 하지않습니다. 만약 Animation이라는 Property를 추가하고자 한다면 기존에는 Button객체를 상속받아 Animation Property를 포함한 새로운 객체를 생성해주어야했죠. 하지만 WPF에서는 Attatched Property를 사용하여 새로운 객체를 생성할 필요없이 Button객체에 Property를 부여 할 수 있습니다. ( 간단하게 활용면에서만 설명을 한 내용이라 다소 실제 내용과 차이가 있을 수 있습니다.)

원래의 목적은 부모와 자식간의 Dependency Property를 연결짓기 위해 사용되는 방법으로, 대표적인 Grid의 Grid.Row, DockPanel의 DockPanel.Dock가 있으며 이번시간에는 이런 Attatched Dependency Property를 사용하여 어느 컨트롤에서나 적용할 수 있는 Pixel Snapper를 구현 해보고자 합니다. Attatched Dependency Property와 관련된 보다 자세한 내용은 MSDN을 참고해주시기 바랍니다.(http://msdn.microsoft.com/ko-kr/library/ms749011.aspx)

아래는 PixelSnapper의 AttatchedDependency Property를 정의하는 부분입니다.

Attatched DependencyProperty를 사용하기 위해 DependencyProperty를 RegisterAttached 메서드를 사용하여 등록하고, Property에 접근하기 위한 Get,Set메서드를 위와 같이 정의했습니다. 이때 이름은 반드시 Get[PropertyName] , Set[PropertyName]과 같이 구현이 되어야 하며 모든 FrameworkElement에 IsSnap Property를 노출시킬 것이기 때문에 Parameter 로  FrameworkElement를 사용했습니다.

그리고 본격적으로 FrameworkElement의 IsSanp에 따라 객체의 Pixel 고정여부를 지정하기 위해 IsSnap Property가 갱신되었을때 아래와 같은 처리를 해줍니다.

LayoutUpdate의 경우 sender에 null이 들어오기때문에 어떤 객체로부터 호출되었는지를 판단하기 위해 람다식을 이용하여 파라미터로 Target객체를 넘기는 대리자를 생성하여 LayoutUpdate를 호출하게 됩니다. 이외 나머지 소스코드 부분은 대부분 이전에 소개해드릴 Fixed Pixel Control과 동일하므로 설명은 여기까지로 하고, 실제 사용할때에는 아래와 같이 사용하시면됩니다.

[XAML에서의 사용]


[C#에서의 사용]

더 궁금하신점이나 기타 문의는 이메일이나 댓글로 남겨주시면 되겠습니다. 아래는 테스트를 할 수 있는 소스코드입니다.




 

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
WPF2009/04/21 01:00

안녕하세요 김대욱입니다. 오늘은 이전 시간에 이어 WPF를 사용하여 구현한 IPhone UI입니다. 이전시간과 크게 달라진 점은 없구요.. (그래서 2가 아닌 1.5입니다..) 조만간 다시 바빠질것같아서 그전에 지금까지 구현한 소스코드와 간략한 설명을 적어놓는게 좋겟다 싶어 포스팅을 하게됬습니다.

이전시간과 달라진 점은 MainScreen에서 Icon이 등록된 Page를 마우스를 이용하여 이동할 수 있다는 점과 하단 페이지를 표시해주는 원을 추가했습니다. 마우스를 사용하여 페이지를 약간의 관성(?)을 적용해 이동하는 부분은 추후 다른 페이지에서도 적용기 가능하기 때문에 MovingPanel이라 이름의 Control을 구현했습니다.

아래는 시연 동영상입니다.


아마 이번주 주말까지는 프로젝트가 있어서 더 작업은 힘들것 같습니다. (중간중간 시간이 되면 작업하도록 하겠습니다.)
그리고 아래는 소스코드입니다. 아직 소스코드가 완성된게 아니라 최적화도 안되있을 뿌더러 주석도 달려있지 않습니다.. ^^ 이해해 주시길 바라며, 질문이나 기타 궁금하신점은 이메일 또는 리플 남겨주시면 답변드리도록 하겠습니다.




저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
WPF2009/04/19 15:38
안녕하세요 김대욱입니다. 현재 WPF를 사용하여 IPhone User Interface를 구현해보고 있습니다. 아직 미구현 한 부분들이 몇가지 있기때문에 완성이 되는데로, 자세한 설명과 소스코드를 함께 포스팅 하도록 하겠습니다. 아래는 지금까지 구현된 내용의 동영상입니다.




각각의 페이지를 Screen이라 정하고 각 Screen간 화면 전환을 관리 해주는 ScreenManager를 구현하여 각 페이지를 관리합니다. 지금까지는 LockScreen, MainScreen(일부), PhoneScreen이 구현되어 있으며 UI구현을 목적으로 구현해보고 있기때문에, UI와 관련된 기능 이외에 기타 기능은 동작하지 않습니다. (PhoneScreen에서 전화가 되길 기대하시는건 아니겠죠? ^^;)

각페이지에서는 아이콘들을 제외한 모든 내용이 XAML을 통해 작성되었으며 Expression Beld 3와 VisualStudio2008을 사용하여 구현하고 있습니다. 해상도는 320*480으로 실제 IPhone과 동일한 사이즈입니다.

질문및 문의는 이메일또는 리플로 남겨주세요. 감사합니다.


저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
WPF2009/02/15 14:49

오랜만의 포스팅입니다. 인터뷰동영상이 떡하니 메인에 떠있는지라 들어올때마다 민망해 죽을거같아 얼른 가리려고 새로운 글을 올립니다!! (Wii Controller를 사용한 프로그램은 바쁜일이 좀 진정되면 작업하여 포스팅하겠습니다. 죄송합니다 ㅠ_ㅠ)

일단 이번시간에 구현한 내용은 아래 동영상과 같이 원 모양을 한 Listbox가 되겠습니다.  순서에 상관없는 List를 표현하고자 할때 사용하시면 유용할것 같습니다.



동영상에서 등장하는 이미지는 제가 작업한게 아니기 때문에 첨부파일에는 포함하지 않았습니다.
적당한 이미지로 대체 하신후 테스트해주세요 !

기본적인 Listbox의 Control Template으로 사용하거나 독립적인 Control로 사용할수 있습니다. 아이템 마우스 휠을 사용하여 목록을 회전 시킬 수 있으며, 클릭하게되면 해당 아이템이 맨 위쪽에 위치하게 됩니다. 그리고 아이템 개수에 따라 크기가 유동적으로 변하는 기능을 포함하고 있습니다.

특별히 코드에 어려운 부분이 없기때문에 추가 설명은 생략하겠습니다... (필요하시다면 말씀해주세요...)
 ListBox객체를 생성하고 ControlTemlate에 CircleListBoxContainer를 적용한뒤 ItemHost로 지정해줍니다. 그리고 평소 사용하던대로 Listbox를 사용하시면 되겠습니다.

아래는 소스코드입니다.


 아래는 이번시간에 만들어본 내용을 바탕으로 구현된 응용버전입니다. (여자친구와 함께 만들고있는 Mashup Tool UI입니다.)




기타 궁금하신 점은 이메일이나 리플로 남겨주시면 답변해드리도록 하겠습니다!!


크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
WPF2008/12/23 06:10

안녕하세요. 이번시간에는 페이지가 이동할때마다 FadeIn/Out 효과를 나타내는 TabControl을 구현해 보도록 하겠습니다. 아래는 구현 결과 동영상 입니다.


(그림은 디시인사이드 김여아 겔러리에서 가져왔습니다. 동영상이 뚝뚝 끊기네요 -_-)

왼쪽에는 Tab이 들어가고 오른쪽에는 Content가 들어갑니다.  간단하게 버튼 몇개와 애니메이션을 사용하면 위와 같이 쉽게 구현 할 수 도 있지만, 이번 시간에는 TabControl의 Template을 사용하여 추가되는 컨텐츠에 상관없이 동작함을 유의 깊게 살펴보시기 바랍니다.  소스코드가 꾀 길기 때문에 전체코드를 이곳에 모두 올리지는 않고 필요한 부분만 설명하겠습니다. 전체 소스코드는 첨부파일로 올리겠습니다.

이번 예제에서 XAML 코드에서 하는 일은 단지 레이아웃과 관련된 기능만을 수행하기 때문에 중요한 부분만 설명하도록 하겠습니다.


    
        
            
                
                
                
            
            
                
                    
                
            
            
            
                
                    
                    
                
            
        
    



위 코드를 보시면 ControlTemplate에 하나의 ContentPresenter를 사용하는게 일반적인데 두개의 ContentPresenter를 사용했습니다. 이유는 기존의 하나의 ContentPresenter만 가지고는 두 페이지의 내용이 오버랩 되도록 할 수 없기 때문에 두개의 ContentPresenter를 사용합니다.  계속해서 C#코드입니다.



public partial class SimpleTabControl : TabControl
{

    ContentPresenter CurrentItem { get; set; }
    ContentPresenter BeforeItem { get; set; }

    DoubleAnimation FadeIn = new DoubleAnimation(0, 1, Duration.Automatic, FillBehavior.HoldEnd) { SpeedRatio = 2, AccelerationRatio = 0.7 };
    DoubleAnimation FadeOut = new DoubleAnimation(1, 0, Duration.Automatic, FillBehavior.HoldEnd) { SpeedRatio = 2, AccelerationRatio = 0.7 };
       

    public SimpleTabControl()
    {
        InitializeComponent();

        Loaded += new RoutedEventHandler(SimpleTabControl_Loaded);
        SelectionChanged += new SelectionChangedEventHandler(SimpleTabControl_SelectionChanged);

        FadeOut.Completed += new EventHandler(FadeOut_Completed);
        
    }

    void FadeOut_Completed(object sender, EventArgs e)
    {
        BeforeItem.Visibility = Visibility.Collapsed;
    }

    void SimpleTabControl_Loaded(object sender, RoutedEventArgs e)
    {
        CurrentItem = GetTemplateChild("CurrentItem") as ContentPresenter;
        BeforeItem = GetTemplateChild("BeforeItem") as ContentPresenter;
        CurrentItem.Content = SelectedContent;
    }

    void SimpleTabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (CurrentItem == null) return;

        CurrentItem.Content = (e.AddedItems[0] as ContentControl).Content;
        BeforeItem.Content = (e.RemovedItems[0] as ContentControl).Content;

        BeforeItem.Visibility = Visibility.Visible;
        CurrentItem.BeginAnimation(ContentPresenter.OpacityProperty, FadeIn);
        BeforeItem.BeginAnimation(ContentPresenter.OpacityProperty, FadeOut);
    }
}



사용자가 선택한 Tab이 바뀔 때마다 Fade In/Out 효과를 주어야 하므로 SelectionChange이벤트를 사용합니다. CurrentItem과 BeforeItem은 TabControlTemplate에서 만들었던 ContentPresenter로 GetTempalteChild함수를 사용하여 가져옵니다. 

사용자가 페이지를 선택하게되면 SelectionChange이벤트를 통해 기존에 선택되어 있던 페이지는 RemovedItems로, 새로 선택된 페이지는 AddItems에 추가되어 넘어옵니다. 이때 CurrentItem에는 새로 추가된 페이지의 내용을 넣고 BeforeItem에는 삭제된 페이지의 내용을 넣은뒤 OpacityAnimation을 적용하여 Fade In/Out TabControl을 완성 할 수 있습니다.

간단하면서도 처음 접하기에는 다소 어려운 부분일 수도있습니다만 천천히 따라해보시면 금방 이해하실 수 있을 것입니다.
질문은 리플이나 이메일로 해주시면 답변드리도록 하겠습니다.

 

 


크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스
WPF2008/12/23 02:25
안녕하세요. 이번시간에는 아래그림과 같이 WPF Control에서 선택되었을 때 생기는 점선으로된 테두리를 없애는 방법에 대하여 소개하려고합니다. 너무나도 간단한 내용이기에 포스팅을 해야하나 고민하다가 작업시 매번 접하는 문제일 뿐더러 많은 사람들이 궁금해 하는 부분인지라 포스팅을 합니다.


위 사진은 아래와 같은 XAML코드로 제작 되었습니다. 아무것도 없습니다 -_-그냥 Gird에 Button하나 올린것 뿐이죠..

<WINDOW title="WPF Korea - whatisthat.co.kr" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" SizeToContent="WidthAndHeight" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="Wit.MainWindow">
    <GRID Margin="10" Height="300" Width="300">
        <BUTTON Height="100" Width="200" Content="WPF KOREA" />
    </GRID>
</WINDOW
그럼 코드를 아래와 같이 조금만 수정해 보도록 하겠습니다.

<WINDOW title="WPF Korea - whatisthat.co.kr" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" SizeToContent="WidthAndHeight" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="Wit.MainWindow">
    <GRID Margin="10" Height="300" Width="300">
        <BUTTON Height="100" Width="200" Content="WPF KOREA" FocusVisualStyle="{x:Null}">
    </GRID>
</WINDOW
Button의 FocusVisualStyle속성을 Null로 지정했습니다. 그럼 결과를 보겠습니다.


짜잔~~ -_- ;; 테두리가 사라졌습니다!! 단순하게 하려면 위와 같은 방법으로도 해결 할 수 있지만, Application 전체에 걸쳐서 적용시키고자한다면 이전에 소개해드렸던 Overriding default SystemColors를 참고하셔서 해결하실 수도 있습니다.
언제나 그랬듯이 질문은 메일이나 리플로 남겨주세요~



크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 곡스