'ListBox'에 해당되는 글 3건

  1. 2009/06/12 WPF Cube ListBox (6)
  2. 2009/02/15 Circle List Box Control Using WPF Element (1)
  3. 2008/07/22 ListBox Item Size Animation (1)
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/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/07/22 12:15

 

사용자 삽입 이미지

자려고 누웠다가, 스타한판만 더하고 자야지 하고 일어나서 포스팅 하고 있는 김대욱입니다. (-_-)
저번 사내 교육 때 보여주려고 준비했었던 예재인데요, 어디에 짱박아 둔지 몰라서 못 보여 줬던 자료입니다.
그림을 보시면 이해가 되셨을 텐데요, 마우스를 올리면 해당 아이템의 크기가 변하는 것(?)입니다.
Style과 EventTrigger, Animation을 적절히 활용한 예라고 할 수 있는데요.
코드는 아래와 같습니다.

<ListBox>
<ListBox.ItemContainerStyle>
<Style>
<Style.Triggers>
<EventTrigger RoutedEvent="ListBoxItem.MouseEnter">
<BeginStoryboard>
<Storyboard TargetProperty="Content.Height">
<DoubleAnimation To="100" Duration="0:0:0.5" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="ListBoxItem.MouseLeave">
<BeginStoryboard>
<Storyboard TargetProperty="Content.Height">
<DoubleAnimation To="30" Duration="0:0:0.5" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>

<!-- ListBox Items -->
<Rectangle Fill="Red" Width="250" Height="30" />
<Rectangle Fill="Orange" Width="250" Height="30" />
<Rectangle Fill="Yellow" Width="250" Height="30" />
<Rectangle Fill="Green" Width="250" Height="30" />
<Rectangle Fill="Blue" Width="250" Height="30" />
<Rectangle Fill="DarkBlue" Width="250" Height="30" />
<Rectangle Fill="Purple" Width="250" Height="30" />
</
ListBox>

가장먼저 눈에 들어 오는 것은 ListBox에 총 7가지의 무지개 색 Rectangle 객체가 추가되어 있다는 사실 입니다. 그리고 위해 뭔가 주저리주저리 써있는데요, 하나씩 살펴보겠습니다.
<ListBox.ItemContainerStyle>라는 녀석은 ListBoxItemContainer의 스타일을 지정하는 Property로 ListBox에 추가된 Item을 둘러싸고 있는 일종의 Container에 대한 스타일입니다. 이를 통해 리스트 박스에 추가된 객체들의 Style을 일괄적으로 지정 해 줄 수 도 있습니다.

<EventTrigger> 의 RoutedEvent Property를 사용해 마우스가 올려졌을 때 와 떠났을 때에 대한 이벤트를 정의합니다.
StoryBoard를 시작하기위해 <BeginStoryboard> 를 사용했으며 마우스동작에 따라 객체의 높이가 변하게 할것이므로, StoryBoard의 TargetProperty를 Content.Height로 설정합니다.
그리고 Height Property는 Double형이므로, DoubleAnimation을 사용하여 크기가 변하는 Animation을 구현합니다.

MouseEnter이벤트가 발생했을 경우에는 크기를 100까지 키우고, Leave이벤트가 발생 했을 때는 다시 30으로 변환합니다.
MouseLeave의 Animation에서의 To="30"은 생략이 가능하며, 기본적으로 Trigger가 적용되기 전의 값으로 설정됩니다.


이와 같은 방법을 사용하여 위 그림과 같은 DockBar같은 형식의 구현도 가능합니다~

김대욱(kdw234@naver.com) / http://whatisthat.co.kr

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