在我的 WPF 项目中,我需要一个具有以下行为的面板。当您单击一个项目时,它应该转到顶部项目。
我对此有几个问题: 1. 我应该创建我的自定义面板并在 ArrangeOverride 方法中添加某种动画吗?
因此,我需要添加一些事件处理程序,但不要对位于此面板中的元素进行子类化,并且我还需要为上移过程设置动画。我非常坚持这个问题的解决方案。
谢谢。
在我的 WPF 项目中,我需要一个具有以下行为的面板。当您单击一个项目时,它应该转到顶部项目。
我对此有几个问题: 1. 我应该创建我的自定义面板并在 ArrangeOverride 方法中添加某种动画吗?
因此,我需要添加一些事件处理程序,但不要对位于此面板中的元素进行子类化,并且我还需要为上移过程设置动画。我非常坚持这个问题的解决方案。
谢谢。
我认为您不需要编写面板或向面板添加行为,如果您对类进行正确建模,那么您可以使用具有选择项目(即 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 设置动画当前点击位置到列表顶部