0

我正在尝试实现一个 WPF 自定义控件,该控件FrameworkElement在两个单独的面板中显示两个对象集合。该控件派生自ItemsControl并具有一个CanvasIsItemsHost="True"设置的控件。此外,我有一个Collection<FrameworkElement>名字OtherItems,我想在不同的Canvas.

自定义控件定义了一个附加属性:myControl.Position它确定项目在其画布中的 X 位置。该控件还定义了 aMinValueMaxValue依赖属性。控件计算使用MinValue,MaxValuecontrol.Position属性将UIElement's 放置在适当的位置:

<----------0---------->结果是:MinValue=10, MaxValue=110, myControl.Position=60

我可以处理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>

OnPositionChanged当我无法联系发件人的父母时,我该如何处理来电?我假设这是 WPF 布局控件一直在做的事情,带有像Grid.Rowand这样的附加属性DockPanel.Dock,但是他们如何管理它呢?

4

0 回答 0