2

在我的 WPF 项目中,我需要一个具有以下行为的面板。当您单击一个项目时,它应该转到顶部项目。

面板中项目的行为

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

因此,我需要添加一些事件处理程序,但不要对位于此面板中的元素进行子类化,并且我还需要为上移过程设置动画。我非常坚持这个问题的解决方案。

谢谢。

4

1 回答 1

0

我认为您不需要编写面板或向面板添加行为,如果您对类进​​行正确建模,那么您可以使用具有选择项目(即 ListBox)的 ItemsControls 来实现 - 我假设您正在使用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 属性,在此属性更改时,您可以将此项目添加到列表中顶部元素的 Items 集合中。

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

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

于 2013-02-26T16:23:13.817 回答