Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为面板中的项目添加自定义行为?_C#_.net_Wpf_Wpf Controls - Fatal编程技术网

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

C# 如何为面板中的项目添加自定义行为?,c#,.net,wpf,wpf-controls,C#,.net,Wpf,Wpf Controls,在我的WPF项目中,我需要一个具有以下行为的面板。当你点击一个项目时,它应该位于项目的顶部 关于这一点,我有几个问题: 1.我是否应该创建自定义面板并在ArrangeOverride方法中添加动画 所以,我需要添加一些事件处理程序,但不需要对该面板中的元素进行子类化,而且我还需要设置向上移动的过程的动画。我一直在寻找解决这个问题的办法 谢谢。我认为您不需要编写面板或向面板添加行为,如果您对类进行了正确的建模,那么您尝试使用具有选择项功能的ItemsControl(即ListBox)可以实现的操

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

关于这一点,我有几个问题: 1.我是否应该创建自定义面板并在ArrangeOverride方法中添加动画

所以,我需要添加一些事件处理程序,但不需要对该面板中的元素进行子类化,而且我还需要设置向上移动的过程的动画。我一直在寻找解决这个问题的办法


谢谢。

我认为您不需要编写面板或向面板添加行为,如果您对类进行了正确的建模,那么您尝试使用具有选择项功能的ItemsControl(即ListBox)可以实现的操作-我假设您使用的是MVVM

这种方法的好处是,您不会创建和维护可能不需要的其他配电盘类型。另外,模型和viewmodel中的所有内容都可以进行全面的单元测试。我建议尽可能使用或扩展现有的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>();
}
}
公共类ItemsVM
{
//您始终可以根据业务规则对项目进行排序
公共ObservableCollection项{get;set;}
公共项vm()
{
Items=新的ObservableCollection(){
new ItemModel(),new ItemModel()
};
}
}
型号

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>();
}
}
公共类ItemModel
{
公共布尔值被选为{get;set;}
公共ObservableCollection项{get;set;}
公共项目模型()
{
Items=新的ObservableCollection();
}
}
查看

<ListBox ItemsSource={Binding Items} SelectionMode=Single />

一旦用户单击列表框中的一个项目,您应该在ItemVM中设置相应项目的IsSelected属性,在该属性更改时,您可以将该项目添加到列表中顶部元素的items集合中

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

关于动画
这可以使用代码隐藏或附加属性来完成,想法很简单,您知道用户单击列表框的位置,您应该能够获得列表框中顶部元素的位置,将数据模板从当前单击位置设置为列表顶部的动画

这种方法不适用于我的情况。例如,据我所知,您只能在ListView中放置从ListViewItem派生的项。如果我在这个面板中放置网格或一些用户控件,它应该如何工作?我知道MVVM,但在这种情况下,我需要一些定制的面板。我现在正在开发这个面板。当我完成时,我将源放在GitHub上。所有ItemsControl都有一个ItemsPanel属性,您可以设置它,这个ItemPanel可以是任何WPF面板。每个单独的项目都可以有一个ItemTemplate,其中包含您选择的控件。但是如果你想创建一个自定义面板,那是你的选择。我已经开发了这种面板,如果我有空闲时间,我肯定会在github上发布源代码。