Как я могу добавить пользовательское поведение для элемента на панели?

В моем проекте WPF мне нужна панель со следующим поведением. Когда вы нажимаете на элемент, он должен перейти на верхний верхний элемент.

Поведение элемента на панели

У меня есть несколько вопросов по этому поводу: 1. Должен ли я создать свою собственную панель и добавить как-то анимацию в метод ArrangeOverride?

Итак, мне нужно добавить некоторые обработчики событий, но без подкласса элемента, лежащего в этой панели, а также мне нужно анимировать процесс подъема вверх. Я совершенно застрял с решением этой проблемы.

Спасибо.


person Leonid    schedule 26.02.2013    source источник


Ответы (1)


Я не думаю, что вам нужно писать панель или добавлять поведение к вашей панели, если вы правильно моделируете свои классы, то, что вы пытаетесь сделать, достижимо с помощью ItemsControls с возможностью выбора элементов (т.е. ListBox) - я предполагаю, что вы используете МВВМ.

Преимущество этого подхода в том, что вы не создаете и не поддерживаете дополнительный тип панели, который вам, вероятно, не нужен. Кроме того, все в вашей модели и модели просмотра может быть полностью протестировано. Я рекомендую использовать или расширять существующие элементы управления и контейнеры 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, вы должны установить свойство IsSelected соответствующего элемента в ItemVM, при изменении этого свойства вы можете добавить этот элемент в коллекцию Items верхнего элемента в вашем списке.

У вас есть полный контроль над тем, как вы будете шаблонировать свою ItemModel, верхний элемент теперь имеет элемент в коллекции Items, который может быть показан так, как у вас есть на вашей диаграмме.

Относительно анимации Это можно сделать либо с помощью кода программной части, либо с помощью прикрепленного свойства. Идея проста: вы знаете, где пользователь щелкнул элемент списка, и вы сможете получить положение верхнего элемента в ListBox, анимируйте DataTemplate из текущей позиции клика в верхнюю часть списка

person Shrinand    schedule 26.02.2013
comment
Этот подход не будет работать для моего случая. Например, вы можете размещать в ListView только элементы, производные от ListViewItem, как я знаю. Как это должно работать, если я помещу Grid или какой-либо пользовательский элемент управления в эту панель? Я знаю о MVVM, но в этом случае мне нужна настраиваемая панель. Я сейчас разрабатываю эту панель. Я размещаю исходники на GitHub, когда заканчиваю. - person Leonid; 27.02.2013
comment
Все ItemsControls имеют свойство ItemsPanel, которое вы можете установить, это ItemPanel может быть любой панелью WPF. Каждый отдельный элемент может иметь ItemTemplate с выбранными вами элементами управления. Но если вы хотите создать собственную панель, это ваш выбор. - person Shrinand; 27.02.2013
comment
Я разработал такую ​​панель, и если у меня будет свободное время, я обязательно опубликую исходники на гитхабе. - person Leonid; 27.09.2013