Instrumenting UI
-
08-06-2019 - |
質問
かinstrumentingおUIです。過去にこのまま人ユーザをユーザーインターフェースがどんなに見つかりでは事例に関 どのよう 機器のUI.
によるinstrumentingというのは、データの収集や利用状況に関する性能のシステム。は、MSDNの記事ゥルメンテーションとは、 http://msdn.microsoft.com/en-us/library/x5952w0c.aspx.つかまえたいと思っているボタンのユーザーをクリックし、キーボードshortuctsいう条件のもとでの検索など。
- かinstrumentingおUI?
- はどのような形式での保存の計測?
- こんにちは処理の観測データはもらえますか?
- こんにちはこのUIコードをこの装置論理によるものか。
具体的には、私は私の実施におけるUIコンポーネントのラインナップで、このユニークなコンポジットの課題と比較しinstrumenting、ウェブベースのアプリケーション.(振込みの観測データの中心に位置します。とはいえ、私はこの技術の提供や実施機器を経由のような概念を付けます。
- いすユーザ、コンポーネントのラインナップ。というモチベーションがしっこで実現するのでしょうか。
編集:以下のブログ記事なこともしないので解 ピクセル-イン-遺伝子のブログ:技術のためのUIの監査アプリのコンポーネントのラインナップ
解決 4
以下のブログ記事を与えるか良いアイデアをinstrumenting、コンポーネントのラインナップ申し込み:技術のためのUIの監査アプリのコンポーネントのラインナップ.
他のヒント
ここではどのように使える簡単なイベントマネージャー-フックのUIイベントやエキスのキーとなる情報、イベントなどの種類のUI要素の名前のイベントの親ウィンドウのタイプの名前です。トのリストも抽出、選択した項目です。
このソリューションの話を聞くためにクリックの管理からButtonBase(ボToggleButton,...)は、選択の変化を制御からセレクタ(ListBox,TabControl,...).で延長する他の種類のUI要素により多くの微細粒子溶液とする。の刺激の ブラッド-チの答え.
public class UserInteractionEventsManager
{
public delegate void ButtonClickedHandler(DateTime time, string eventName, string senderName, string senderTypeName, string parentWindowName);
public delegate void SelectorSelectedHandler(DateTime time, string eventName, string senderName, string senderTypeName, string parentWindowName, object selectedObject);
public event ButtonClickedHandler ButtonClicked;
public event SelectorSelectedHandler SelectorSelected;
public UserInteractionEventsManager()
{
EventManager.RegisterClassHandler(typeof(ButtonBase), ButtonBase.ClickEvent, new RoutedEventHandler(HandleButtonClicked));
EventManager.RegisterClassHandler(typeof(Selector), Selector.SelectionChangedEvent, new RoutedEventHandler(HandleSelectorSelected));
}
#region Handling events
private void HandleSelectorSelected(object sender, RoutedEventArgs e)
{
// Avoid multiple events due to bubbling. Example: A ListBox inside a TabControl will cause both to send the SelectionChangedEvent.
if (sender != e.OriginalSource) return;
var args = e as SelectionChangedEventArgs;
if (args == null || args.AddedItems.Count == 0) return;
var element = sender as FrameworkElement;
if (element == null) return;
string senderName = GetSenderName(element);
string parentWindowName = GetParentWindowTypeName(sender);
DateTime time = DateTime.Now;
string eventName = e.RoutedEvent.Name;
string senderTypeName = sender.GetType().Name;
string selectedItemText = args.AddedItems.Count > 0 ? args.AddedItems[0].ToString() : "<no selected items>";
if (SelectorSelected != null)
SelectorSelected(time, eventName, senderName, senderTypeName, parentWindowName, selectedItemText);
}
private void HandleButtonClicked(object sender, RoutedEventArgs e)
{
var element = sender as FrameworkElement;
if (element == null) return;
string parentWindowName = GetParentWindowTypeName(sender);
DateTime time = DateTime.Now;
string eventName = e.RoutedEvent.Name;
string senderTypeName = sender.GetType().Name;
string senderName = GetSenderName(element);
if (ButtonClicked != null)
ButtonClicked(time, eventName, senderName, senderTypeName, parentWindowName);
}
#endregion
#region Private helpers
private static string GetSenderName(FrameworkElement element)
{
return !String.IsNullOrEmpty(element.Name) ? element.Name : "<no item name>";
}
private static string GetParentWindowTypeName(object sender)
{
var parent = FindParent<Window>(sender as DependencyObject);
return parent != null ? parent.GetType().Name : "<no parent>";
}
private static T FindParent<T>(DependencyObject item) where T : class
{
if (item == null)
return default(T);
if (item is T)
return item as T;
DependencyObject parent = VisualTreeHelper.GetParent(item);
if (parent == null)
return default(T);
return FindParent<T>(parent);
}
#endregion
}
い、実際にロギングに使っているlog4net作成した別のロガーの名前が"交流"にログインユーザーの相互作用クラス'ログ'ここでは、単に自分の静的なラッパーのためのlog4net.
/// <summary>
/// The user interaction logger uses <see cref="UserInteractionEventsManager"/> to listen for events on GUI elements, such as buttons, list boxes, tab controls etc.
/// The events are then logged in a readable format using Log.Interaction.Info().
/// </summary>
public class UserInteractionLogger
{
private readonly UserInteractionEventsManager _events;
private bool _started;
/// <summary>
/// Create a user interaction logger. Remember to Start() it.
/// </summary>
public UserInteractionLogger()
{
_events = new UserInteractionEventsManager();
}
/// <summary>
/// Start logging user interaction events.
/// </summary>
public void Start()
{
if (_started) return;
_events.ButtonClicked += ButtonClicked;
_events.SelectorSelected += SelectorSelected;
_started = true;
}
/// <summary>
/// Stop logging user interaction events.
/// </summary>
public void Stop()
{
if (!_started) return;
_events.ButtonClicked -= ButtonClicked;
_events.SelectorSelected -= SelectorSelected;
_started = false;
}
private static void SelectorSelected(DateTime time, string eventName, string senderName, string senderTypeName, string parentWindowTypeName, object selectedObject)
{
Log.Interaction.Info("{0}.{1} by {2} in {3}. Selected: {4}", senderTypeName, eventName, senderName, parentWindowTypeName, selectedObject);
}
private static void ButtonClicked(DateTime time, string eventName, string senderName, string senderTypeName, string parentWindowTypeName)
{
Log.Interaction.Info("{0}.{1} by {2} in {3}", senderTypeName, eventName, senderName, parentWindowTypeName);
}
}
の出力がそのように、この省略以外に関連するログの作品の応募がありました。
04/13 08:38:37.069 INFO Iact ToggleButton.Click by AnalysisButton in MyMainWindow 04/13 08:38:38.493 INFO Iact ListBox.SelectionChanged by ListView in MyMainWindow. Selected: Andreas Larsen 04/13 08:38:44.587 INFO Iact Button.Click by EditEntryButton in MyMainWindow 04/13 08:38:46.068 INFO Iact Button.Click by OkButton in EditEntryDialog 04/13 08:38:47.395 INFO Iact ToggleButton.Click by ExitButton in MyMainWindow
すことを検討してはどうかと思う log4net.堅牢なロギングの枠組みに存在する単一のDLL.でもこの"不"を求めているタイプモードになる場合には重要なプロセスの進んログでリソースが解放されているビットです。
また簡単に設定束をINFOレベルのロガーやトラックのすべてのユーザー相互作用す必要とするのではなくクラッシュバグをファイルを送信しません。このままのプログラミングすべてのエラー致命的なコードを別のファイルとすることができるので郵送いたします。
ご使用のコンポーネントのラインナップのコマンドを、各カスタムコマンドでログインに行動します。の記録ができま方のコマンドが始まりました。
おそらく Microsoftは、UIオートメーション コンポーネントのラインナップです。そのための枠組みの自動化おUIかでのログをとるために使用されるもののためにお---
また、自動化の枠組みの自動試験におけるUIコンポーネントのラインナップ.
免責事項:私の勤める会社を販売しているこの製品は、な私は、こうした開発業者がこの特定の商品:).
ご興味のある方に商品を提供するからこそ実行時の知機能の追加をDotfuscator)の混用トラッキング機能へおります。アプリケーションが可能です。しを提供するのみならず、実際のトラッキング機能のデータ収集、処理および報告としての機能です。
また最近ではディスカッションでは、事業のソフトウェアフォーラムセミナーにも掲載してありま http://discuss.joelonsoftware.com/default.asp?biz.5.680205.26 .
高レベルの概要をこちらをご参照: http://www.preemptive.com/runtime-intelligence-services.html .
また現在、私が取り組んでい文書があり技術的にドキュメンテーションを認識し、そのエリアを表示一部のエリアを表示があり向上、ぜひ<url>までご連絡くださいれば、通知いただいた場合、完了します。