bl4kh4k
bl4kh4k

Reputation: 1440

Listbox items are placed ontop of each other

I can't seem to figure out why the listbox items are place ontop of each other... they should be below one another. Heres some markup and code.

<ListBox x:Name="DeviceList" Background="#ff4c4c4c" BorderThickness="0" ScrollViewer.CanContentScroll="False" MouseEnter="DeviceList_MouseEnter" MouseLeave="DeviceList_MouseLeave" 
                     ManipulationBoundaryFeedback="DeviceList_ManipulationBoundaryFeedback" ItemContainerStyle="{DynamicResource ResourceKey=ListBoxItemStyle}" PreviewMouseDown="DeviceList_PreviewMouseDown" 
                     PreviewMouseMove="DeviceList_PreviewMouseMove" PreviewMouseUp="DeviceList_PreviewMouseUp" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" DockPanel.Dock="Bottom">
                <ListBox.Resources>
                    <ResourceDictionary>
                        <ResourceDictionary.MergedDictionaries>
                            <ResourceDictionary Source="..\Utilities\Resources\Themes\Slider.xaml"></ResourceDictionary>
                        </ResourceDictionary.MergedDictionaries>
                    </ResourceDictionary>
                </ListBox.Resources>
            </ListBox>

#region Constructors
    /// <summary>
    /// Constructor.
    /// </summary>
    public ConfiguratorView()
    {
        InitializeComponent();

        foreach (Device device in (Application.Current.Windows[1].DataContext as ConfiguratorViewModel).AvailableDevices)
        {
            devices.Add(AddDevice(device.Icon + "_def", device.Description));
        }

        DeviceList.ItemsSource = devices;
    }
    #endregion


    #region Internal Members
    /// <summary>
    /// Add the device to the list of devices.
    /// </summary>
    /// <param name="icon"></param>
    /// <param name="description"></param>
    /// <returns></returns>
    private Canvas AddDevice(string icon, string description)
    {
        Canvas canvas = new Canvas();
        canvas.Name = icon;

        ContentControl backgroundContent = new ContentControl();
        Label label = new Label();

        backgroundContent.Template = Application.Current.FindResource(icon) as ControlTemplate;
        label.Content = description;

        canvas.Children.Add(backgroundContent);
        canvas.Children.Add(label);

        return canvas;
    }

The device list adds the canvas as the item... and then i set the ItemsSource to the List. Loading it shows all icons right on top of the last one. Any thoughts?

Upvotes: 1

Views: 397

Answers (1)

Ashley Grenon
Ashley Grenon

Reputation: 9565

Everything will appear on top of each other because Canvas.Top defaults to NaN.

You could manually calculate the appropriate Canvas.Top values, but I would suggest:

  1. Keeping the Device object simple with a property for Description and icon

  2. Creating a DataTemplate for the ListBox items to display those properties.

EDIT:

For example (I haven't tested this)

Say your Device class looks something like this:

public class Device
{
    public string Description { get; set; }
    public object Icon { get; set; } 
}

And then your datatemplete for the ListBox could look like this:

<ListBox ItemsSource="{Binding Devices}">
    <ListBox.ItemsTemplate>
        <DataTemplate>
            <Canvas>
                <!-- add items here -->
                <TextBlock Text="{Binding Description}" Canvas.Top="5" />
            <Canvas>
        </DataTemplate>
    </ListBox.ItemsTemplate>
</ListBox>

Upvotes: 1

Related Questions