我正在尝试实现一个WPF自定义控件,该控件在两个单独的面板中显示两个FrameworkElement
对象集合。该控件源自ItemsControl
,并且Canvas
设置为IsItemsHost="True"
。另外,我有一个名为Collection<FrameworkElement>
的{{1}},我想在其他OtherItems
中显示。
自定义控件定义了一个附加属性:Canvas
,用于确定项目在其画布中的X位置。该控件还定义了myControl.Position
和MinValue
依赖项属性。控件计算使用MaxValue
,MinValue
和MaxValue
属性将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布局控件一直在做的事情,附加属性如OnPositionChanged
和Grid.Row
,但他们如何管理它?