Какой самый простой способ получить следующего брата (обертку) на холсте в WPF? - PullRequest
1 голос
/ 27 января 2012

У нас есть холст, в котором есть коллекция Children с индексатором.У нас есть ссылка на одного из детей.Мы просто хотим получить следующего потомка в списке, и если мы пойдем дальше конца, мы хотим снова обернуться.

В настоящее время мы делаем это с помощью цикла, чтобы получить индекс того, который у нас есть., затем мы увеличиваем это, проверяем границы и, если необходимо, переносим, ​​затем используем этот результат, чтобы получить дочерний элемент от индексатора ...

... но это так трижды, как и в началепрямо для меня.Мне нужно что-то упустить.

Примечание. Если для какой-либо коллекции на основе индексов есть универсальное решение, это было бы замечательно, но даже если это просто для холста, это тоже хорошо.

Ответы [ 2 ]

1 голос
/ 27 января 2012

Я мог бы что-то упустить, но я думаю, что то, что вы хотите, может быть легко достигнуто, скажем, у меня есть некоторый XAML, подобный этому

<Canvas x:Name="canv">
    <Rectangle x:Name="canvChild1"/>
    <Rectangle x:Name="canvChild2"/>
    <Rectangle x:Name="canvChild3"/>
    <Rectangle x:Name="canvChild4"/>
</Canvas>

Тогда все, что вам нужно, это получить безопасный индекс (то есть тот, который упакован), поэтому, если у меня есть дескриптор 1-го элемента и я хочу получить следующий, а затем 4-й и хочет получить следующий, я мог бы использовать код как это

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        Debug.WriteLine(GetSafeElementForIndex(
            this.canv.Children.IndexOf(canvChild1)).Name);

        Debug.WriteLine(GetSafeElementForIndex(
            this.canv.Children.IndexOf(canvChild4)).Name);
    }


    private FrameworkElement GetSafeElementForIndex(int currentIndex)
    {
        return (FrameworkElement)this.canv.Children[WrappedIndex(++currentIndex)];
    }


    private int WrappedIndex(int currentIndex)
    {
        return currentIndex % this.canv.Children.Count;
    }
}

Это печатает это:

canvChild2

canvChild1

Я думаю, вы могли бы также использовать отличные вещи LINQ to Tree от Colin Eberhardts, которые позволили бы вам использовать LINQ против визуального дерева: http://www.codeproject.com/Articles/62397/LINQ-to-Tree-A-Generic-Technique-for-Querying-Tree

Это довольно удобный материал, который позволяет вам обращаться с VisualTree так же, как с XML, и перемещаться по другой оси.

0 голосов
/ 27 января 2012

Вы, вероятно, не должны использовать холст напрямую, а скорее ItemsControl с холстом как ItemsPanel. Вы также можете использовать CollectionView поверх предметов, что позволяет вам получать и перемещать CurrentItem вокруг (MoveCurrentTo*).

...