如何在面板中添加项目的自定义行为?

时间:2013-02-26 12:32:37

标签: c# .net wpf wpf-controls

在我的WPF项目中,我需要一个具有以下行为的面板。当你点击一个项目时,它应该是上面的顶部项目。

Behavior of an item in the panel

我有几个问题: 1.我应该创建自定义面板并在ArrangeOverride方法中添加某种动画吗?

所以,我需要添加一些事件处理程序,但是没有子类化这个面板中的元素,而且我还需要设置上层过程的动画。我完全坚持解决这个问题的方法。

感谢。

1 个答案:

答案 0 :(得分:0)

我认为您不需要编写面板或向面板添加行为,如果您正确地模拟您的类,您可以使用ItemsControls选择项目(即ListBox)来实现 - 我假设你正在使用MVVM。

这种方法的好处是您不会创建和维护您可能不需要的其他面板类型。此外,您的模型和视图模型中的所有内容都可以进行全面的单元测试。我建议尽可能使用或扩展现有的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属性,在此属性更改中,您可以将此项目添加到列表中top元素的Items集合中

您可以完全控制如何模板化您的ItemModel,顶部项目现在在Items集合中有一个项目,可以按照您在图表中的方式显示。

关于动画 这可以使用代码隐藏或附加属性来完成,想法很简单,你知道用户点击ListBox的位置,你应该能够获得ListBox中顶部元素的位置,从当前点击动画DataTemplate位置到列表顶部