首页 文章

在stackpanel WPF中排序元素

提问于
浏览
7

我有一个stackpanel,其中包含一些在运行时添加或删除的用户控件 . 这些元素有一个索引,当我新建它时,我需要保留这些元素,我需要保持这些元素按索引排序,所以我做了一个快速排序函数,根据索引对它们进行排序,但是在交换的行上

y = items[i]; //y is a temp variable
          items[i] = items[j];

我明白了

“指定的索引已在使用中 . 首先断开指定索引处的Visual子节点”

我尝试将它们复制到临时变量,从集合中删除它们然后使用UIElementCollection中的Insert函数将它们分配到它们的右侧索引,但后来我得到了

“指定的Visual已经是另一个Visual的子项或CompositionTarget的根”

是否有我需要的克隆元素或某些东西在某处丢失?

4 回答

  • 0

    为什么不使用ListBox / ItemsSontrol并使用CollectionViewSorce / SortDescription来完成这项工作 . 将元素添加到LayOut面板(如stackpanel)不是一种有效的WPF应用程序 . 具有垂直方向的StackPanel是ListBox / ItemsControl的默认设置,但如果您想要一些不同的布局,则可以始终覆盖ListBox.ItemsPanel模板

    如果您可以关注 MVVM apporach,那么在ViewModel类中指定属性(在您的情况下它将是Index)并在listBox级别设置SortDescription将自动为您提供此功能 . 您只需添加/删除ObservableCollection绑定到ListBox.ItemsSource,而不是添加和删除实际的UIElements . 并指定正确的DataTemplate .

    如果您不熟悉CollectionViewSource,请检查此项 - http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource.sortdescriptions.aspx

    代码将更像下面..它非常简单 .

    <UserControl.Resources>
        <CollectionViewSource x:Key="sourceCollection" Source="{Binding YourObservableCollectionProperty}">
           <CollectionViewSource.SortDescriptions>
            <scm:SortDescription PropertyName="YourProperty-Index"/>
           </CollectionViewSource.SortDescriptions>
         </CollectionViewSource>
       </UserControl.Resources>       
    
      <ItemsControl ItemsSource="{Binding Source={StaticResource sourceCollection}}"/>
    

    注意:< - XMLNS:SCM = “CLR-命名空间:System.ComponentModel程序;装配= WindowsBase” - >

  • 1

    上面的答案是正确的,但是如果你不能改变你的stackpanel(如果你没有足够的时间,或者写了很多与stackpanel相关的代码),试试这个:

    • 将控件存储在列表或词典中

    • 对列表或词典进行排序

    • 使用以下方法从stackpanel中删除控件:StackPanel.Children.Remove(child)

    • List或Dictionary的Foreach成员使用以下命令向StackPanel添加控件:StackPanel.Children.Insert(i,child);

    注意:代码正在运行,Remove函数从StackPanel项目(从树中)删除控件,但控件已经在内存中,以便控件能够插入任何StackPanel或相同的 .

  • 4

    如果您想这样做,您需要确保Parent为null,并且您的面板中的索引未被使用 .

    如果你只是将它交换为临时变量,它仍然是相同的引用 .

    使用Visual Tree Helper以取消或移动您的UIElement .

  • 11

    如果给每个元素指定特定名称(即索引) . 删除此控件时,您只需重命名结果控件 .

    之后,您的所有控件都将被排序 .

相关问题