

<https://sites.google.com/site/toriaezunomemo/home/visual-
studiomemo/hittotesuto>

上のサイトのプログラムを参考にしてヒットテストのプログラムをC#のWPFで以下のように実装することを目標としています。

クリック  
→クリックした部分に図形がいくつあるか表示  
→Rectangle、Ellipseの名前（Green,Gray等）を表示

ですが最後の名前取得の部分がどのようになればいいのかわかりません。

x.VisualHit.GetType().Name
だとEllipseやRectangleは表示できるのですが、その対応している名前の部分はどのようにして取得すればいいのでしょうか？


CC BY-SA 3.0
2015-12-07T11:01:06.627
19709
2016-04-06T01:44:46.653
11180
question
c# wpf
ヒットテストにおけるオブジェクトの名前の詳細表示


一番単純な方法は`FrameworkElement`にキャストして`Name`プロパティを見ることだと思います。

[code]

    var fe = (FrameworkElement)x.VisualHit;
    Console.WriteLine(fe.Name);
    
[/code]

もう少し高度な工法としては、独自の添付プロパティを定義してそこに必要な値を設定しておく手があります。Visual
StudioのC#エディター上で`propa`と入力し、Tabを二回押すと以下のようなコードが生成されます。なおハイライトされている個所は書き換えてください。

[code]

    class Hoge
    {
        public static string GetPiyo(DependencyObject obj)
        {
            return (string)obj.GetValue(PiyoProperty);
        }
    
        public static void SetPiyo(DependencyObject obj, string value)
        {
            obj.SetValue(PiyoProperty, value);
        }
    
        // Using a DependencyProperty as the backing store for Piyo.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty PiyoProperty =
            DependencyProperty.RegisterAttached("Piyo", typeof(string), typeof(Hoge), new PropertyMetadata(null));
    }
    
[/code]

この定義を行ったあと、XAML上で`xmlns`(Visual Studio
2015であれば`local`が既定で追加されています)を設定すると`local:Hoge.Piyo`というプロパティに任意の文字列が設定できるようになりますので、実行時に`Hoge.GetPiyo(fe)`を呼び出して設定した値を取得できます。


CC BY-SA 3.0
2015-12-07T11:25:19.397
19710
2015-12-07T11:25:19.397
5750
19709
answer


ヒットしたオブジェクトが[`FrameworkElement`](https://msdn.microsoft.com/ja-
jp/library/system.windows.frameworkelement.aspx)であれば[`Name`](https://msdn.microsoft.com/ja-
jp/library/system.windows.frameworkelement.name\(v=vs.110\).aspx)プロパティを持っているので、キャストしてそれを取得すればいいかと。

[code]

    foreach (HitTestResult x in hitResultsList)
    {
        string name = "";
        FrameworkElement fe = x.VisualHit as FrameworkElement;
        if (fe != null)
            name = fe.Name;
    
        Console.WriteLine("{0} {1}", x.VisualHit.ToString(), name);
    }
    
[/code]


CC BY-SA 3.0
2015-12-07T11:28:32.653
19711
2015-12-07T11:28:32.653
4765
19709
answer