こんなのです。
ソースコード
ぐだぐだとソースの説明をしてもしょうが無いので、GitHub にプロジェクトを上げて置きました。
https://github.com/noitaro/wpf-excel-shape-line
技術的なお話
Thumb の現在位置を取得
Canvas コントロールの上に Thumb コントロールを置いて、ドラッグ移動できるようにしています。
その時 Thumb の現在位置を取得する方法ですね。
1 | var point = new Point(Canvas.GetLeft(this), Canvas.GetTop(this)); |
Thumb に位置を設定
その逆です。
1 | Canvas.SetLeft(this, point.X); |
Thumb の Template に書いた コントロール を取得
Thumb コントロールの見た目を変えるのに Template を書き換えないと駄目なんだが、Template に書いたコントロールを取得するのに一癖あった。
1 | var btn = Template.FindName("top", this) as Button; |
Behavior を動的に設定
UserControl を動かすのに Thumb 以外の方法だと MouseDragElementBehavior を使う手法がある。
今回は コードビハインド から設定したのでその方法。
1 | var behaviors = Interaction.GetBehaviors(path); |
こんな感じで、初期位置と ドラッグ移動したときのイベントも設定できる便利なやつ。
コードビハインド から Behavior を取得
その逆。
1 | var behaviors = Interaction.GetBehaviors(path); |
1つのコントロールに複数の Behavior が設定出来るが、今回は1つなので First で取得しています。
おわりに
コントロールを移動させる処理に手こずりました。
いろいろなアプローチがあるから、適材適所で使い分けていけたらいいと思います。