У меня есть stackpanel с некоторыми usercontrols, которые добавлены или удалены во время времени выполнения. Эти элементы имеют индекс, который я присваиваю им, когда я новый их, я должен сохранить эти элементы отсортированными по тому индексу так я wote функция quicksort, которая сортирует их на основе индекса, но на строке, которая делает свопинг
y = items[i]; //y is a temp variable
items[i] = items[j];
Я добираюсь
"Указанный индекс уже используется. Разъедините Визуального ребенка в указанном индексе сначала"
Я пытался копировать их во временную переменную, удалите их из набора и затем присвойте их их правильному индексу с функцией Вставки в UIElementCollection, но затем я Добираюсь
"Указанный Визуальный уже ребенок другого Визуального или корень CompositionTarget"
Существует ли элемент клона, в котором я нуждаюсь или что-то, что я пропускаю где-нибудь?
Почему бы вам не использовать ListBox / ItemsSontrol и не использовать CollectionViewSorce / SortDescription для выполнения этой работы. Добавление элементов в панели LayOut, например stackpanel, не является эффективным способом использования приложений WPF. StackPanel с вертикальной ориентацией используется по умолчанию для ListBox / ItemsControl, но если вам нужен другой макет, вы всегда можете переопределить ListBox.ItemsPanel Template
Если вы можете следовать MVVM apporach, то это вопрос указания свойство (в вашем случае это будет Index ) в вашем классе ViewModel и установка SortDescription на уровне listBox автоматически предоставит вам эту функцию. Вместо добавления и удаления фактических элементов UIElements вам нужно просто добавить / удалить привязку ObservableCollection к ListBox.ItemsSource. И укажите правильный 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-namespace: System.ComponentModel; assembly = WindowsBase" ->
Если вы хотите это сделать, вам нужно убедиться, что родительский элемент имеет значение NULL, а также что ваш индекс в вашей панели не используется.
Если вы просто замените его временной переменной, это все та же ссылка.
Используйте Visual Tree Helper, чтобы отключить или переместить UIElement.
если вы дадите каждому элементу специфическое имя (которое является индексом). Когда вы удалите этот элемент управления, вы можете просто переименовать элементы управления результатами.
после этого все ваши элементы управления будут отсортированы.