FrameworkElement
オブジェクトの 2 つのコレクションを 2 つの別々のパネルに表示する WPF カスタム コントロールを実装しようとしています。コントロールは から派生しItemsControl
、Canvas
which がIsItemsHost="True"
設定されています。さらに、別の に表示したいCollection<FrameworkElement>
名前があります。OtherItems
Canvas
myControl.Position
カスタム コントロールは、キャンバス内の項目の X 位置を決定する添付プロパティを定義します。コントロールは、依存関係プロパティも定義しMinValue
ますMaxValue
。MinValue
コントロールは、MaxValue
とcontrol.Position
プロパティを使用して を計算し、をUIElement
適切な位置に配置します。
<----------0---------->
MinValue=10、MaxValue=110、myControl.Position=60 の結果です。
コンテナ内にあるアイテムの配置を処理できますが、myControl.Items
コンテナ内にあるアイテムにはmyControl.OtherItems
nullParent
参照があります。
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
だと思いますが、どのように管理するのでしょうか?