代码之家  ›  专栏  ›  技术社区  ›  Leonid

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

  •  2
  • Leonid  · 技术社区  · 13 年前

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

    Behavior of an item in the panel

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

    所以,我需要添加一些事件处理程序,但不需要子类化这个面板中的元素,而且我还需要动画化向上的过程。我非常坚持这个问题的解决方案。

    谢谢

    1 回复  |  直到 13 年前
        1
  •  0
  •   Shrinand    13 年前

    我认为你不需要写一个面板或在面板中添加行为,如果你正确地建模你的类,你试图做的事情是可以使用具有选择项目能力的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属性,在该属性更改时,您可以将该项目添加到列表中顶部元素的items集合中。

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

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

    推荐文章