Search code examples
c#wpftreeviewstackpanel

WPF TreeviewItem header text is set to object type when using stackpanel


I'm trying to make a treeview with items that has both image and text.

I have followed this example http://www.codeproject.com/Articles/124644/Basic-Understanding-of-Tree-View-in-WPF but I'm getting a strange behavior on the treeviewitem header.

The header is supposed to contain an image and a label but instead this is shown as the header text of all treeviewitems: System.Windows.Controls.StackPanel

Here is my code:

tree_view.Items.Add(GetTreeView("text"));

private TreeViewItem GetTreeView(string text)
{
    TreeViewItem newTreeViewItem = new TreeViewItem();

    // create stack panel
    StackPanel stack = new StackPanel();
    stack.Orientation = Orientation.Horizontal;

    // create Image
    Image image = new Image();
    image.Source = new BitmapImage(new Uri(@"/ComponentName;component/Resources/Images/warning.png", UriKind.Relative));

    // Label
    Label lbl = new Label();
    lbl.Content = text;

    // Add into stack
    stack.Children.Add(image);
    stack.Children.Add(lbl);

    // assign stack to header
    newTreeViewItem.Header = stack;

    return newTreeViewItem;
}

Edit:

Also, I have this in the TreeView's HeaderTemplate to wrap the text:

<Setter Property="HeaderTemplate">
     <Setter.Value>
         <DataTemplate>
             <TextBlock Width="139" TextWrapping="Wrap" Text="{Binding}" />
         </DataTemplate>
     </Setter.Value>
</Setter>

Solution

  • I managed to fix this by removing the HeaderTemplate in the xaml.

    Then, in my code-behind file I changed the Label to Textblock, then set the TextWrapping and Width-properties on the Textblock-object like this:

    tree_view.Items.Add(GetTreeView("text"));
    
    private TreeViewItem GetTreeView(string text)
    {
        TreeViewItem newTreeViewItem = new TreeViewItem();
    
        // create stack panel
        StackPanel stack = new StackPanel();
        stack.Orientation = Orientation.Horizontal;
    
        // create Image
        Image image = new Image();
        image.Source = new BitmapImage(new Uri(@"/ComponentName;component/Resources/Images/warning.png", UriKind.Relative));
    
        // Label
        Textblock lbl = new Textblock();
        lbl.Text = text;
        lbl.TextWrapping = TextWrapping.Wrap;
        lbl.Width = 139;
    
        // Add into stack
        stack.Children.Add(image);
        stack.Children.Add(lbl);
    
        // assign stack to header
        newTreeViewItem.Header = stack;
    
        return newTreeViewItem;
    }