С самого начала я хочу сказать, что наградите кого-нибудь, кто может помочь мне с моей проблемой, наградить 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");
}
}
}
* 1005Сначала я сделал 3 кнопки, чтобы вставить текст в список.Допустим, я нажимаю button1 и button2, у меня будет этот список:
item15
item14
item13
item12
......
item7
item0
item1
.....
item6
После этого я хочу нажать на «item12», затем, когда я нажимаю button3, я хочу, чтобы мой «item12» оставался в том же состоянии.spot, пока текст генерируется (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);
}
}
Чтодля меня это значит, что он центрирует выбранный элемент, но свиток уменьшается, только иногда он также центрируется.И моя проблема в том, что опять же, только иногда выбранный элемент исчезает из поля зрения.
Что было бы замечательно, если бы я мог сделать и элемент, и прокрутку по центру.Но в первую очередь предмет не должен исчезать из виду.