2012-04-03 5 views
6

が、私はいくつかのグローバルイベントハンドラにwpf UIElementの固有の識別子はありますか?私のWPFフォームでユーザーアクションをログに記録するため

私は正確にイベントを発生制御するログオンしたい

を追加し、ASP.NetでClientIdのようなWPF UIElementのためのいくつかのユニークな識別子はありますか?

+1

[FrameworkElement.Name](http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.name.aspx)プロパティを試したことがありますか? – DmitryG

+0

Yea Dmitry、Nameは空でもかまいませんが、ログを記録するためにすべてのコントロールに名前を付けることは望ましくありません。 –

+0

[PersistId](http://msdn.microsoft.com/en-us/library/)@ArsenMkrt system.windows.uielement.persistid.aspx)プロパティが探しているようです。悲しいかな、それは現在廃止されており、明らかに交換されていません。たぶん、独自の識別子を生成することに陥る可能性があります。その場合、[この質問](http://stackoverflow.com/q/750947/464709)を参照してください。 –

答えて

2

私の質問に答えが見つかったようですが、答えはいいえ、これを行う方法はこちらMSDN here(http://msdn.microsoft.com/en-us/magazine/dd483216.aspx)

トップレベルのウィンドウコントロール定義には、 名前属性が含まれていないことに注意してください。これは重要なことですが、テストの自動化を書くときは、 を参照すると、 コントロールへの参照をMUIAライブラリを使用して簡単に取得できるようになるため、AutomationIdプロパティ にアクセスします。コントロールのName属性 XAML Name属性を持たないコントロールは AutomationIdプロパティを受け取りません。このアイデアは、 の具体的な低レベルの例で、セキュリティ、拡張性、およびテスト自動化など、 のものに対するアプリケーション設計の問題を考慮する重要性を示しています。

0

あなただけの追加を見ているNameまたはx:NameそうWindow/UserControl/Pageは、指定された名前を持つクラスの残りの部分にコントロールを公開しています。

<Window ...> 
    <Grid> 
     ... 

     <!-- These controls are named, so you can access them directly by name --> 
     <Button x:Name="btnMyNamedButton" ... /> 
     <Button Name="btnMyOtherNamedButton" ... /> 

     <!-- This control is not named, so you can not directly access it by name --> 
     <Button ... /> 
    <Grid> 
</Window> 

public partial class MyWindow : Window 
{ 
    public MyWindow() 
    { 
     InitializeComponent(); 

     //btnMyNamedButton can be accessed 
     //btnMyOtherNamedbutton can also be accessed 

     //The third button can be accessed, but not directly by name. 
    } 
} 

また、あなたは常にFrameworkElement.Tagオブジェクトを使用することができます。これは、任意の情報を格納するためのもので、必要に応じてこれを一意の識別子として使用できます。

+0

Answer @myのおかげで感謝しますが、名前は私が探しているものではありません。まず、すべてのUIコントロールをロギングのための名前を付けることを望んでおらず、2番目に多くの編集コントロールを持つグリッドでは不可能ですセルテンプレート... –

8

なぜハッシュコードを使用しないでください。

あなたは、彼らは、同じオブジェクトであることを確認するために値を比較することができ、その簡単なので、これはあなたがプログラムを実行するたびに異なる

明らか.GetHashCode()


編集でそれらを取得します実際には、プロセスがログに記録されるたびにログを更新しない限り、これはひどい考えです。私は、あなたログが作成された時点で、各オブジェクトのハッシュ値を格納することができ、私は

+0

私はテストしたが、その問題はGetHashCode()がそのセッションにしかないことである。アプリケーションを終了して再起動すると、UI要素はすべて新しいHashCodeを取得します。しかし、それでも+1。 – Paparazzi

+0

@ExitMusic、GetHashCodeは、少なくともアプリケーションの再起動後に変更されるため、ログが使用できなくなります...もっと安定した識別子を持ちたい –

+0

ハッシュは一意ではありません。 –

0

は、私は、ユーザーの行動を記録するために、信じることを好きなら、私は知らないわけ

しかしまだ可能このアプローチはデフォルトですべての標準UIコントロールでサポートされているため、UIAutomation treeAutomationElement.AutomationIdプロパティを使用できます。多くのサードパーティのコントロールは、要素(たとえばグリッドセル)のAutomationIdもサポートしています。 AutomationIdは、テスト自動化スクリプトの作成に役立ちます。

+0

Hmmmm ... AutomationIdも設定する必要がありますが、設定されていない場合、空の名前が返されます...私が探しているものを行う方法はないと思います... –

1

これを行う方法の1つはカスタム属性です。そう...

UIElementあなたは(たとえば、ユーザーコントロール)をログに記録したいのように:

[UserInterfaceID(ID = "{F436E9B3-C2F6-4CF8-8C75-0A2A756F1C74}")] 
public partial class MyUserControl : UserControl 
{ 
    InitializeComponent(); 
    // or whatever... 
} 

その後、カスタムを必要とするが、あなたのコードで今すぐクラス

[System.AttributeUsage(AttributeTargets.Class)] 
public class UserInterfaceIDAttribute : Attribute 
{ 
    public Guid ID { get; set; } 
} 

属性、あなたが行うことができます

MyUserControl control = new MyUserControl(); 
foreach(object att in control.GetCustomAttributes(typeof(UserInterfaceAttribute),false)) 
{ 
    UserInterfaceAttribute uiAtt = (UserInterfaceAttribute)att; 
    Guid theID = uiAtt.ID; 
} 

このコントロールには、次のような属性がタグ付けされています。コードでは、アプリケーションを強制終了/起動する回数に関係なく、一意の識別子は決して変更されません。

もちろん、これはIDにアクセスする方法を示す基本的な例ですが、多分、ある種のアスペクト指向プログラミングを使いたいと思うでしょう。私はCastle Windsor Interceptorsを使ってこのようなことをしていますが、それはこの記事の範囲外です。

理想的には、何らかの種類のイベントが発生した場合にこのIDにアクセスすることが理想的です。インターセプタを使用すると、呼び出される前にメソッド呼び出しを取得して、上記のようにIDを検索してアクションを記録することができます。また、コントロールでイベントが発生したときに何らかの方法で

this.GetCustomAttributes(...) 

を使用して、そこにログコードを埋め込むことができます。このパターンは、横断的な懸念を巻き起こして、アスペクト指向プログラミングアプローチのいくつかのタイプをよりよく作り上げているため、最良ではありません...しかし、やはり私は逸脱し、このポストの範囲外です...しかし、あなたはアイディア。

これが役に立ちます。

+0

なぜ私は属性?私は自分のUI要素のすべてのNameプロパティを設定できますが、winformでは可能なので何も設定せずに方法を探したいだけです –

関連する問題