2013-02-26 3 views
2

내 WPF 프로젝트에서 다음과 같은 동작을하는 패널이 필요합니다. 항목을 클릭하면 상단 상단 항목으로 이동해야합니다.패널에 항목에 대한 사용자 지정 동작을 추가하려면 어떻게합니까?

Behavior of an item in the panel

나는이에 대한 몇 가지 질문이 있습니다 1. 내 사용자 정의 패널을 만들고 한 ArrangeOverride 방법에 어떻게 든 애니메이션을 추가해야 하는가?

그래서 이벤트 핸들러를 추가해야하지만이 패널에있는 요소를 서브 클래 싱하지 않고 상단으로 이동하는 과정을 애니메이션화해야합니다. 나는이 문제에 대한 해결책을 고집했다.

감사합니다.

답변

0

패널을 작성하거나 패널에 비헤이비어를 추가 할 필요가 없다고 생각합니다. 클래스를 모델링 한 경우 아이템 선택 기능 (예 : ListBox)이있는 ItemsControls를 사용하여 달성 할 수 있습니다. MVVM을 사용한다고 가정합니다.

이 접근법의 이점은 필요하지 않은 추가 패널 유형을 만들고 유지 관리하지 않는다는 것입니다. 모델 및 뷰 모델의 모든 항목을 완벽하게 테스트 할 수 있습니다. 가능할 때마다 기존 WPF 컨트롤 및 컨테이너를 사용하거나 확장하는 것이 좋지만이 경우에는 WPF 컨트롤과 컨테이너가 없어도 얻을 수 있습니다. 뷰 모델

public class ItemsVM 
{ 

// You can always keep the items sorted based on you business rules 
public ObservableCollection<ItemModel> Items {get;set;} 

public ItemVM() 
{ 
Items = new ObservableCollection<ItemModel>(){ 
new ItemModel(), new ItemModel() 
}; 
} 
} 

모델

public class ItemModel 
{ 
public bool IsSelected {get;set;} 
public ObservableCollection<ItemModel> Items {get;set;} 

public ItemModel() 
{ 
Items = new ObservableCollection<ItemModel>(); 
} 
} 

보기

<ListBox ItemsSource={Binding Items} SelectionMode=Single /> 

중 하나를 클릭 한 번 ListBox의 항목을 ItemVM에서 해당 항목의 IsSelected 속성으로 설정해야합니다.이 속성 변경시이 항목을 목록의 맨 위 요소의 Items 컬렉션에 추가 할 수 있습니다.

템플릿의 작성 방법을 완전히 제어 할 수 있습니다. 이제 최상위 항목에는 Items 컬렉션에있는 항목이 있으며, 이는 다이어그램에서와 같은 방식으로 표시 될 수 있습니다. 애니메이션 이 코드 숨김 사용 중 하나를 수행 할 수 또는 연결된 속성에 관한

는 아이디어는 사용자가 목록 상자에서 클릭 한 위치 당신이 알고있는, 간단하고 당신의 상위 요소의 위치를 ​​얻을 수 있어야합니다 ListBox, 현재 클릭 위치에서 목록 맨 위로 DataTemplate에 애니메이션 적용

+0

이 방법은 필자의 경우에는 작동하지 않습니다. 예를 들어, 내가 아는 ListViewItem에서 파생 된 항목 만 ListView에 배치 할 수 있습니다. Grid 또는 일부 사용자 정의 컨트롤을이 패널에 배치하면 어떻게 작동합니까? MVVM에 대해 알고 있지만이 경우 사용자 정의 된 패널이 필요합니다. 지금이 패널을 개발 중입니다. 끝나면 GitHub에 소스를 배치합니다. – Leonid

+0

모든 ItemsControls에는 설정할 수있는 ItemsPanel 속성이 있습니다.이 ItemPanel은 모든 WPF Panel이 될 수 있습니다. 각 개별 Item은 사용자가 선택한 컨트롤을 사용하여 ItemTemplate을 가질 수 있습니다. 그러나 원하는대로 사용자 정의 패널을 만들려면이 패널을 선택하십시오. – Shrinand

+0

나는 그런 종류의 패널을 개발했다. 그리고 내가 자유 시간을 가지기를 바란다면 나는 github에 소스를 확실히 발표 할 것이다. – Leonid

관련 문제