デザインタイム アドナーを WPF コントロールに追加できましたが、デザイナーに組み込まれているものを制御するにはどうすればよいですか? (つまり、誰かが標準的なデザイナーの親指/ゴムバンド/装飾品/...) を使用してコントロールをドラッグまたはサイズ変更したときに、関数が呼び出されるようにしたい
.
以下は、私が達成しようとしていることの詳細です:
私は、子の配置とサイズ設定を行うカスタム ルールを持つ WPF Canvas のようなコントロールを作成しています。(回転する必要がありますが、それは別の問題です)
<my:MyCustomCanvas>
<my:SomeControl my:Name="child control #1" Canvas.Left="20" Canvas.Top="30"/>
<my:SomeOtherControl my:Name="child control #2" Canvas.Left="70" Canvas.Top="80"/>
</my:MyCustomCanvas>
これを実現する 1 つの方法は、次のように ArrangeOverride() をオーバーライドすることです。
public class CustomCanvas : Canvas
{
protected override Size ArrangeOverride(Size arrangeSize)
{
foreach (UIElement child in InternalChildren)
{
double left = child.GetValue(Canvas.LeftProperty) - this.GetValue(ActualWidthProperty) / 2;
double top = child.GetValue(Canvas.TopProperty) - this.GetValue(ActualHeightProperty) / 2;
child.Arrange(new Rect(new Point(left, top), child.DesiredSize));
}
return arrangeSize;
}
}
動作しますが、デザイナーで子コントロールをドラッグまたはサイズ変更しようとすると、通常の WPF キャンバス上にあった場合の場所にジャンプします (つまり、 X = Left ではなく、 X = Left - Width / 2 as ArrangeOverride)。指示する)
デザイナーをコントロールする必要があるようです。Microsoft は、その方法についてのドキュメントも提供しています。動作しているように見えますが、ビジュアル スタジオに組み込まれている装飾(コントロールが選択されたときにコントロールの周囲に表示されるサイズ変更のつまみ) の動作を制御する方法を見つけることができず、新しいものを追加する方法のみを見つけました。確かに、いくつか追加して、標準のものに触れないように指示することはできますが、それは醜いクラッジのように見えます.
この質問の目的のために、親キャンバスを変更する必要があるメソッドのみが優先されますが、キャンバスとその子の両方のソースコードにアクセスできる (つまり、メソッドをオーバーライドできる) と仮定しても安全です。
デザイナーの拡張性に関する公式ドキュメントは、私にはやや混乱しているように見えます。私もウェブで問題を検索するのに運がありませんでした。したがって、書籍、記事、例、参照元のリンクなど、有用な手がかりがあれば大歓迎です。