Search code examples
c#treeviewscrollbehaviortreeviewitem

How can I prevent my WPF TreeView from focusing the selected TreeViewItem


I'm working on a TreeView and i have some childs into it.

The problem is that when I select a child with a width superior than the TreeView, the scroll automaticaly moves to show all the selected item, i want to disable this behavior!

I've already tried to handle the RequestBringIntoView event but it doesnt seems to work!

Thanks for your help!

Here is the XAML:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="350">
    <Grid>
        <TreeView RequestBringIntoView="TreeView_RequestBringIntoView">
            <TreeViewItem Header="Monster huge tree view item Header OMG WTF IS THAT BBQ"/>
            <TreeViewItem Header="TreeView Elem 1">
                <TreeViewItem Header="TreeView Elem 1"/>
                <TreeViewItem Header="TreeView Elem 1"/>
                <TreeViewItem Header="TreeView Elem 1"/>
                <TreeViewItem Header="TreeView Elem 1">
                    <TreeViewItem Header="TreeView Elem 1"/>
                    <TreeViewItem Header="TreeView Elem 1"/>
                    <TreeViewItem Header="TreeView Elem 1"/>
                    <TreeViewItem Header="TreeView Elem 1"/>
                    <TreeViewItem Header="TreeView Elem 1"/>
                    <TreeViewItem Header="TreeView Elem 1">
                        <TreeViewItem Header="TreeView Elem 1"/>
                        <TreeViewItem Header="TreeView Elem 1"/>
                        <TreeViewItem Header="TreeView Elem 1"/>
                        <TreeViewItem Header="TreeView Elem 1">
                            <TreeViewItem Header="TreeView Elem 1"/>
                            <TreeViewItem Header="TreeView Elem 1"/>
                            <TreeViewItem Header="TreeView Elem 1"/>
                            <TreeViewItem Header="TreeView Elem 1">
                                <TreeViewItem Header="TreeView Elem 1"/>
                                <TreeViewItem Header="TreeView Elem 1"/>
                                <TreeViewItem Header="TreeView Elem 1"/>
                                <TreeViewItem Header="TreeView Elem 1">
                                    <TreeViewItem Header="TreeView Elem 1"/>
                                    <TreeViewItem Header="TreeView Elem 1"/>
                                    <TreeViewItem Header="Monster huge tree view item Header OMG WTF IS THAT BBQ">
                                        <TreeViewItem Header="TreeView Elem 1"/>
                                        <TreeViewItem Header="TreeView Elem 1">
                                            <TreeViewItem Header="Monster huge tree view item Header OMG WTF IS THAT BBQ"/>
                                        </TreeViewItem>
                                    </TreeViewItem>
                                </TreeViewItem>
                            </TreeViewItem>
                        </TreeViewItem>
                    </TreeViewItem>
                </TreeViewItem>
            </TreeViewItem>
            <TreeViewItem Header="TreeView Elem 1"/>
            <TreeViewItem Header="TreeView Elem 1"/>
            <TreeViewItem Header="TreeView Elem 1"/>
            <TreeViewItem Header="TreeView Elem 1"/>
            <TreeViewItem Header="TreeView Elem 1"/>
            <TreeViewItem Header="TreeView Elem 1"/>
        </TreeView>
    </Grid>
</Window>

And the code-behing CS:

using System.Windows;

namespace WpfApplication2
{
  /// <summary>
  /// Interaction logic for MainWindow.xaml
  /// </summary>
  public partial class MainWindow : Window
  {
    public MainWindow()
    {
      InitializeComponent();
    }

    private void TreeView_RequestBringIntoView(object sender, RequestBringIntoViewEventArgs e)
    {
      e.Handled = true;
    }
  }
}

Solution

  • You need to handle the RequestBringIntoView event on the TreeViewItem not the TreeView.

    You'll need to use an event setter to do this for databound items like below.

    <TreeView>
        <TreeView.ItemContainerStyle>
            <Style TargetType="TreeViewItem">
                <EventSetter Event="RequestBringIntoView" Handler="Null_Handler"/>
            </Style>
        </TreeView.ItemContainerStyle>
    </TreeView>
    

    or like below for your xaml defined example

    <TreeView>
        <TreeViewItem Header="Monster huge tree view item Header OMG WTF IS THAT BBQ" RequestBringIntoView="Null_Handler"/>
        <TreeViewItem Header="TreeView Elem 1" RequestBringIntoView="Null_Handler">
    </TreeView>
    

    Where Null_Handler is defined as below

    private void Null_Handler(object sender, RoutedEventArgs e)
    {
        e.Handled = true;
    }