проблема возникает из-за такта, который прокручивает список, а затем добавляет новый элемент, а затем повторяет прокрутку. если вы вызовете прокрутку диспетчера, список завершит свою работу, добавив элементы, и затем прокрутите список до вашего элемента.

ого начала я хочу сказать, что я буду награждать 200 Баунти кому-то, кто может помочь мне с моей проблемой.

Это мой простой код (C # с WPF):

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    /// 

    public partial class Window1 : Window
    {
        string fixedItem;

        public Window1()
        {
            InitializeComponent();
            listBox1.ItemContainerGenerator.ItemsChanged += new System.Windows.Controls.Primitives.ItemsChangedEventHandler(list_changes);

        }



        private void list_changes(object sender, System.Windows.Controls.Primitives.ItemsChangedEventArgs e)
        {
            listBox1.ScrollIntoView(fixedItem);
        }

        private void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {      
            fixedItem = (string)listBox1.SelectedItem;        
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            listBox1.Items.Add("item0");
            listBox1.Items.Add("item1");
            listBox1.Items.Add("item2");
            listBox1.Items.Add("item3");
            listBox1.Items.Add("item4");
            listBox1.Items.Add("item5");
            listBox1.Items.Add("item6");

        }

        private void button2_Click(object sender, RoutedEventArgs e)
        {
            listBox1.Items.Insert(0, "item7");
            listBox1.Items.Insert(0, "item8");
            listBox1.Items.Insert(0, "item9");
            listBox1.Items.Insert(0, "item10");
            listBox1.Items.Insert(0, "item11");
            listBox1.Items.Insert(0, "item12");
            listBox1.Items.Insert(0, "item13");
            listBox1.Items.Insert(0, "item14");
            listBox1.Items.Insert(0, "item15");
        }

        private void button3_Click(object sender, RoutedEventArgs e)
        {
            listBox1.Items.Insert(0, "item16");
            listBox1.Items.Insert(0, "item17");
            listBox1.Items.Insert(0, "item18");
            listBox1.Items.Insert(0, "item19");
            listBox1.Items.Insert(0, "item20");
            listBox1.Items.Insert(0, "item21");
            listBox1.Items.Insert(0, "item22");
            listBox1.Items.Insert(0, "item23");
            listBox1.Items.Insert(0, "item24");
        }
    }
}

Сначала я сделал 3 кнопки для вставки текста в список. Допустим, я нажимаю button1 и button2, у меня будет этот список:

item15
item14
item13
item12
......
item7
item0
item1
.....
item6

После этого я хочу нажать «item12», затем, когда я нажимаю button3, я хочу, чтобы мой «item12» оставался на том же месте, пока генерируется текст (4-я позиция в списке).
Короче говоря, каждый раз, когда я нажимаю на элемент, я хочу, чтобы он оставался в том же положении при создании текста.

Так у кого-нибудь есть идеи, как это сделать? Нужно ли использовать объект ScrollViewer для работы с VerticallOffset и ViewportHeigth? Этот простой код, который я разместил, когда я нажимаю на элемент, а затем генерирую текст, перемещает элемент внизу (видимая позиция) и остается там после. Но я вообще не хочу его двигать.

Редактировать:

Хорошо, я попробовал этот код изВот:

FrameworkElement container = listRadioItems.ItemContainerGenerator.ContainerFromItem(fixedItem) as FrameworkElement;

            if (null != container)
            {
                if (ScrollViewer.GetCanContentScroll(listBox))
                {
                    IScrollInfo scrollInfo = VisualTreeHelper.GetParent(container) as IScrollInfo;
                    if (null != scrollInfo)
                    {
                        StackPanel stackPanel = scrollInfo as StackPanel;
                        VirtualizingStackPanel virtualizingStackpanel = scrollInfo as VirtualizingStackPanel;

                        int index = listBox.ItemContainerGenerator.IndexFromContainer(container);

                        if (((null != stackPanel) && (Orientation.Horizontal == stackPanel.Orientation)) || ((null != virtualizingStackpanel) && (Orientation.Horizontal == virtualizingStackpanel.Orientation)))
                        {
                            scrollInfo.SetHorizontalOffset(index - Math.Floor(scrollInfo.ViewportWidth / 2));
                        }
                        else
                        {
                            scrollInfo.SetVerticalOffset(index - Math.Floor(scrollInfo.ViewportHeight / 2));
                        }
                    }
                }
                else
                {
                    Rect rect = new Rect(new Point(), container.RenderSize);

                    FrameworkElement constrainingParent = container;
                    do
                    {
                        constrainingParent = VisualTreeHelper.GetParent(constrainingParent) as FrameworkElement;
                    } while ((null != constrainingParent) && (listBox != constrainingParent) && !(constrainingParent is ScrollContentPresenter));

                    if (null != constrainingParent)
                    {
                        rect.Inflate(Math.Max((constrainingParent.ActualWidth - rect.Width) / 2, 0), Math.Max((constrainingParent.ActualHeight - rect.Height) / 2, 0));
                    }

                    container.BringIntoView(rect);
                }
            }

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

Что было бы замечательно, если бы я мог сделать и элемент, и свиток по центру. Но в первую очередь предмет не должен исчезать из виду.

Ответы на вопрос(6)

Ваш ответ на вопрос