使用附加属性构建类似于Panel的自定义控件

时间:2013-08-22 20:26:13

标签: c# wpf custom-controls attached-properties

我正在尝试实现一个WPF自定义控件,该控件在两个单独的面板中显示两个FrameworkElement对象集合。该控件源自ItemsControl,并且Canvas设置为IsItemsHost="True"。另外,我有一个名为Collection<FrameworkElement>的{​​{1}},我想在其他OtherItems中显示。

自定义控件定义了一个附加属性:Canvas,用于确定项目在其画布中的X位置。该控件还定义了myControl.PositionMinValue依赖项属性。控件计算使用MaxValueMinValueMaxValue属性将control.Position放置在正确的位置:

UIElement的结果是:MinValue = 10,MaxValue = 110,myControl.Position = 60

我可以处理<----------0---------->容器中的项目的定位,但myControl.Items中的项目具有空myControl.OtherItems引用:

Parent

当我无法访问发件人的父母时,如何处理对public static readonly DependencyProperty PositionProperty = DependencyProperty.RegisterAttached("Position", typeof (double), typeof (myControl), new FrameworkPropertyMetadata(0.0, OnPositionChanged)); public static void OnPositionChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) var element = sender as FrameworkElement; if (element != null) { var container = element.Parent as myControl; if (container != null) { container.PositionElement(element); } } } <!--Within the myControl's template--> <Canvas IsItemsHost="True" x:Name="PART_ItemCanvas"/> <ItemsControl ItemsSource="{TemplateBinding OtherItems}"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <Canvas x:Name="PART_OtherItemCanvas"/> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> </ItemsControl.ItemContainerStyle> <!-- As used --> <custom:myControl MaxValue="1000" MinValue="-250"> <custom:myControl.Items> <Button myControl.Position="0"/> <SomethingElse myControl.Position="25"/> <Etc myControl.Position="100"/> </custom:myControl.Items> <custom:myControl.OtherItems> <Button myControl.Position="20"/> <Label myControl.Position="300"/> </custom:myControl.OtherItems> </custom:myControl> 的通话?我假设这是WPF布局控件一直在做的事情,附加属性如OnPositionChangedGrid.Row,但他们如何管理它?

0 个答案:

没有答案