如何阻止ListBox控件包装ListBoxItem中的每个项目?

时间:2011-01-02 06:06:46

标签: wpf listbox canvas wpf-controls listboxitem

我正在创建一个时间轴控件,它使用列表框将我的项目放在画布上。 它有两个部分。表示8小时工作日的基准时间线和表示具有开始和结束时间的工作类型的各个时间轴元素。

可以使用停靠在每个元素左侧和右侧的拇指控件来调整时间轴元素的大小。如果我将timline元素直接放在画布上,调整大小工作正常,但是因为我需要维护一个元素列表,我认为列表框会为我处理它。因此,我将ItemsPanel设为画布,确保所有内容都能很好地呈现。唯一的问题是我无法再调整时间轴元素的大小。我很快就重新开始了,拖动时在我的元素上设置canvas.Left什么也不做,因为元素不再在画布上而是在listboxitem(在画布上)内。

是否可以让Listbox停止将每个项目包装在自己的listboxitem中并将它们包装成自定义ContentControl?

2 个答案:

答案 0 :(得分:2)

试试这个:

class MyListBox : ListBox
{
    protected override System.Windows.DependencyObject GetContainerForItemOverride()
    {
        return new ContentControl();
    }
}

参考:How to change the default item container for ItemsControl?

答案 1 :(得分:0)

可以直接向UIElement(或ListBox.Items)添加ItemsSource。不过,我建议您使用ItemContainerStyle来更改Canvas.LeftCanvas.Top。此样式允许您控制ListBoxItem中为每个项目生成的容器属性(ItemsControl)。

<ListBox ItemsSource="{Binding MyItems}">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="Canvas.Left" Value="{Binding SomeLeftProperty}"/>
            <Setter Property="Canvas.Top" Value="{Binding SomeTopProperty}"/>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>