كيف يمكنني تحديد التالي / TreeViewItem السابق في تريفيف؟

StackOverflow https://stackoverflow.com/questions/462641

سؤال

ولدي الأول / آخر أزرار السابق / التالي / أن تغيير عقدة تابعة مختارة من TreeViewItem. وضع العقدة الأولى والأخيرة عن نخبة ليست مشكلة. على سبيل المثال، لتحديد مشاركة عقدة الطفل:

TreeViewItem selectedItem = (myTreeView.SelectedItem as TreeViewItem);
TreeViewItem ParentItem = (selectedItem.Parent as TreeViewItem);
(ParentItem.Items[ParentItem.Items.Count - 1] as TreeViewItem).IsSelected = true;

وماذا سيكون أسهل طريقة / الأكثر أناقة لضبط السابق / البند التالي كما يتم اختياره؟

وشكرا!

هل كانت مفيدة؟

المحلول

هل يمكن أن تحل محل للحلقة مع مكالمة IndexOf.

int index = ParentItem.Items.IndexOf(MyTreeView.SelectedItem)

وبالطبع سيكون من الجيد للتحقق مما إذا مؤشر + 1 هو مؤشر مجموعة صالح.

ولأخ السابق سيكون مؤشر - 1

نصائح أخرى

وبلدي البديل يعمل بالنسبة لي على الأقل لشجرة على مستوى 4.

إذا المؤشر تلبية treeviewitem آخر، فإنه يذهب في البداية. إذا ضغطت السابق في العقدة الأولى، يمكنك البقاء في المكان.

        // Button Back
    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        if (treeViewStruct.Items.Count < 1) return;
        if (Currentitem == null)
        {
            ((TreeViewItem)treeViewStruct.Items[0]).IsSelected = true;
            return;
        }
        TreeViewItem item = FindPreviousItem(Currentitem);
        if (item == null)
            ((TreeViewItem)treeViewStruct.Items[0]).IsSelected = true;
        else item.IsSelected = true;
    }

    /// <summary>
    /// Get Previous Node
    /// </summary>
    /// <param name="item">Current selected node</param>
    /// <returns></returns>
    private static TreeViewItem FindPreviousItem(TreeViewItem item)
    {
        TreeViewItem foundedItem = null;
        var parentItem = (item.Parent as TreeViewItem);
        if (parentItem != null)
        {
            int index = parentItem.Items.IndexOf(item);
            if (index > 0 && index < parentItem.Items.Count)
            {
                return FindLastChildren((TreeViewItem)parentItem.Items[index - 1]);
            }
            else if (index == 0)
                return parentItem;
        }
        else return item;
        return foundedItem;
    }



    private static TreeViewItem FindLastChildren(TreeViewItem parent)
    {
        if (parent.Items.Count > 0)
        {
            return FindLastChildren((TreeViewItem)parent.Items.Last());
        }
        else return parent;
    }

    // вперед
    private void Button_Click_2(object sender, RoutedEventArgs e)
    {
        if (treeViewStruct.Items.Count < 1) return;
        if (Currentitem == null)
        {
            ((TreeViewItem)treeViewStruct.Items[0]).IsSelected = true;
            return;
        }
        TreeViewItem item = FindNextItem(Currentitem);
        if (item == null)
            ((TreeViewItem)treeViewStruct.Items[0]).IsSelected = true;
        else item.IsSelected = true;
    }


    /// <summary>
    /// Get Next Node
    /// </summary>
    /// <param name="item">Current selected node</param>
    /// <returns></returns>
    private static TreeViewItem FindNextItem(TreeViewItem item)
    {
        TreeViewItem foundedItem = null;
        if (item.Items.Count < 1)
        {
            var parentItem = (item.Parent as TreeViewItem);
            if (parentItem != null)
            {
                int index = parentItem.Items.IndexOf(item);
                if (index > 0 && index < parentItem.Items.Count - 1)
                {
                    return (TreeViewItem)parentItem.Items[index + 1];
                }
                else if (index == parentItem.Items.Count - 1)
                {
                    return FindFirstNextParent(parentItem);
                }
            }
            else return item;
        }
        return (TreeViewItem)item.Items[0];
    }

    private static TreeViewItem FindFirstNextParent(TreeViewItem parent)
    {
        var parentParent = ((TreeViewItem)parent).Parent;
        if (parentParent is TreeViewItem)
        {
            int pindex = ((TreeViewItem)parentParent).Items.IndexOf(parent);
            if ((pindex + 1) < ((TreeViewItem)parentParent).Items.Count)
                return ((TreeViewItem)((TreeViewItem)parentParent).Items[pindex + 1]);
            else
            {
                return FindFirstNextParent(((TreeViewItem)((TreeViewItem)parent).Parent));
            }
        }
        return parent;
    }

وانها ليست أنيقة، ولكنه يعمل. يمكن لأي شخص أن يأتي إلى حل أفضل؟ ( "التالي" وظائف معروضة)

int index = 0;
foreach (TreeViewItem i in ParentItem.Items) {
    if (i.Equals(MyTreeView.SelectedItem)) {
        break;
    }
    index++;
}
(ParentItem.Items[index + 1] as TreeViewItem).IsSelected = true;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top