То, что заставляет ScrollViewer
прокручиваться, заключается в том, что каждый раз, когда изменяется выбор TreeView
, вызывается ScrollIntoView
(внутри исходного кода TreeView
),
this.ItemsControlHelper.ScrollIntoView(container.HeaderElement ?? container);
и он в основном пытается прокрутить либо заголовок, либо весь TreeViewItem
влево.Сначала я подумал, что вы можете изменить оба стиля TreeView
и TreeViewItem
, удалив все левые Margin
и сделав заголовок таким же левым полем, что и кнопка расширения.Тем не менее, это решение работает только для элементов первого уровня, как и на втором уровне, перед элементом есть отступ, так что если вы щелкнете по нему, он снова прокрутится.
Так что я думаю, что чистого решения xaml не существует.Проще всего решить эту проблему, учитывая, что у вас уже есть пользовательский элемент управления вместо вызова (я думаю, что есть проблема с синхронизацией, и поэтому этот код не работает)
_scrollViewer.ScrollToHorizontalOffset(0);
youdo
var scrollableRegions = _scrollViewer.GetVisualDescendants().OfType<IScrollInfo>();
foreach (var region in scrollableRegions)
{
region.SetHorizontalOffset(0);
}
Если вы действительно предпочитаете решения xaml, вы можете также поместить этот код в поведение или присоединенное свойство и просто вставить его, используя Blend.
Сказав все это,другое решение, которое я лично считаю более подходящим, и я использовал его в своем приложении: полностью отключить горизонтальную полосу прокрутки и использовать TextTrimming="WordEllipsis"
для всех моих TextBlocks
внутри TreeViewItems
, чтобы указать пользователю, что текста больше.Также укажите GridSplitter
, чтобы позволить пользователю изменять размер содержимого TreeView
, чтобы видеть полный текст, вместо прокрутки назад и вперед по горизонтали.Но это только мое мнение.
Надеюсь, это поможет!:)