with RadTreeView control,using MVVM binding,the xaml like : AutoScrollToSelectedItem="True" IsVirtualizing="False" looking the attach files,Navigate by the RadBreadcrumb(the RadBreadcrumb and the RadTreeView binding the same data source,and binding the same SelectedIem), when expand the level4,the RadTreeView can't bring the selected item to view,but scroll mouse to the seleced item view,then Navigate again the same postion ,it can scroll,the radtreeview can reach the selected item. I test the microsoft treeview,if the Virtualizing is true,it can't scroll the selected item,but set the Virtualizing to false,it is good. the other question,how to set the style?the selected item's highligh area can expand the full row,like the visual studio.
Ok,I test the treeview.BringPathIntoView(path, new Point(0, 100)); But it can't meet the requirements,I use the Element_MouseDown and Element_MouseUp Event, and when the mouse press ,don't call the function: if (!view.IsPress) { treeView.BringPathIntoView(treeItem.GetPath(), new Point(0, 0)); } else view.IsPress = false; so it is not good,but it is run OK.
Hello Wu Yang Thank you for the provided information. The AutoScrollToSelectedItem property works only in a very specific scenario. The item which you want to scroll to should be realized (generated and added in the visual tree). When the UI Virtualization is enabled only the items that are inside the viewport are generated so if the selected items is outside of it the treeview won't scroll to it. When the UI Virtualization is NOT enabled only the expanded elements are generated initially. So, if your item is not expanded yet it won't be scrolled to. To resolve this you can use the BringPathIntoView() method instead of the property, as you are already doing. As for your last issue the BringPathIntoView() method will scroll the item with a specific offset, you can control this via the last parameter of the method. For example: "treeview.BringPathIntoView(path, new Point(0, 100));" Regards, Martin Ivanov Technical Support Engineer
But there is a new problem: when select the tree item by mouse, if the scrollbar appear,click the item,the item will scroll up,i think because the BringPathIntoView function,Normal when the item is visbile,click or select by code,it should not move up,just it is not visbile,the BringPathIntoView function will make a difference
OK,I resolve the problem by attach the Behavior: public class RadTreeViewBehavior { public static readonly DependencyProperty IsBroughtIntoViewWhenSelectedProperty = DependencyProperty.RegisterAttached("IsBroughtIntoViewWhenSelected", typeof(bool), typeof(RadTreeViewBehavior), new PropertyMetadata(false, new PropertyChangedCallback(OnIsBroughtIntoViewWhenSelectedPropertyChanged))); public static bool GetIsBroughtIntoViewWhenSelected(DependencyObject obj) { return (bool)obj.GetValue(IsBroughtIntoViewWhenSelectedProperty); } public static void SetIsBroughtIntoViewWhenSelected(DependencyObject obj, bool value) { obj.SetValue(IsBroughtIntoViewWhenSelectedProperty, value); } private static void OnIsBroughtIntoViewWhenSelectedPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { if (sender is RadTreeView) { RadTreeView element = sender as RadTreeView; element.SelectionChanged -= Element_SelectionChanged; if ((bool)e.NewValue) { element.SelectionChanged += Element_SelectionChanged; } } } private static void Element_SelectionChanged(object sender, SelectionChangedEventArgs e) { if(sender is RadTreeView) { RadTreeView treeView = sender as RadTreeView; if(treeView.SelectedItem!=null && treeView.SelectedItem is TreeViewItemViewModel) { treeView.BringPathIntoView((treeView.SelectedItem as TreeViewItemViewModel).GetPath()); } } } } the GetPath refer your sample in TreeViewItemViewModel.cs: public string GetPath() { string path = this.Name; TreeViewItemViewModel nextParent = this.Parent; while (nextParent != null) { path = nextParent.Name + @"\" + path; nextParent = nextParent.Parent; } return path; } in RadTreeView XAML style: <Setter Property="bhv:RadTreeViewBehavior.IsBroughtIntoViewWhenSelected" Value="True" /> <Setter Property="telerikNavigation:TextSearch.TextPath" Value="Name"/> of cause,in the radtreeviewitrem xaml style: <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" /> <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> and the binding field: public TreeViewItemViewModel SelectedItem { get { return _SelectedItem; } set { if (_SelectedItem != value) { SelectChanged(_SelectedItem,value); _SelectedItem = value; _SelectedItem.IsSelected = true; //if (_SelectedItem.Parent != null) // _SelectedItem.Parent.IsExpanded = true; this.OnPropertyChanged(() => this.SelectedItem); } } } now when set the SelectedItem value ,the radtreeview can scroll the selected item. but i think the 'AutoScrollToSelectedItem' property is nothing.
added: the radtreeview :<Setter Property="SelectedItem" Value="{Binding SelectedItem}"/> the radtreeviewitem: <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" /> <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> <Setter Property="ToolTip" Value="{Binding Description, Mode=TwoWay}" /> the datasource select: TreeViewItemViewModel _SelectedItem; public TreeViewItemViewModel SelectedItem { get { return _SelectedItem; } set { if (_SelectedItem != value) { SelectChanged(_SelectedItem,value); _SelectedItem = value; _SelectedItem.IsSelected = true; if (_SelectedItem.Parent != null) _SelectedItem.Parent.IsExpanded = true; this.OnPropertyChanged(() => this.SelectedItem); } } }