0

FrameworkElementオブジェクトの 2 つのコレクションを 2 つの別々のパネルに表示する WPF カスタム コントロールを実装しようとしています。コントロールは から派生しItemsControlCanvaswhich がIsItemsHost="True"設定されています。さらに、別の に表示したいCollection<FrameworkElement>名前があります。OtherItemsCanvas

myControl.Positionカスタム コントロールは、キャンバス内の項目の X 位置を決定する添付プロパティを定義します。コントロールは、依存関係プロパティも定義しMinValueますMaxValueMinValueコントロールは、MaxValuecontrol.Positionプロパティを使用して を計算し、をUIElement適切な位置に配置します。

<----------0---------->MinValue=10、MaxValue=110、myControl.Position=60 の結果です。

コンテナ内にあるアイテムの配置を処理できますが、myControl.Itemsコンテナ内にあるアイテムにはmyControl.OtherItemsnullParent参照があります。

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.RowことDockPanel.Dockだと思いますが、どのように管理するのでしょうか?

4

0 に答える 0