/// <summary> /// ウィンドウ情報作成 /// </summary> /// <param name="target">対象</param> /// <param name="rootPos">ルート位置</param> /// <param name="logicalIndex">ロジカルインデックス</param> /// <param name="visualIndex">ビジュアルインデックス</param> /// <returns>ウィンドウ情報</returns> static WindowInfo CreateWindowInfo(object target, System.Windows.Point rootPos, List<int> logicalIndex, List<int> visualIndex) { WindowInfo info = new WindowInfo(); //情報設定 info.TargetObject = target; info.TypeFullName = target.GetType().FullName; FrameworkElement frameworkElement = target as FrameworkElement; if (frameworkElement != null) { try { System.Windows.Point pos = frameworkElement.PointToScreen(new System.Windows.Point(0, 0)); info.Bounds = new Rectangle((int)(pos.X - rootPos.X), (int)(pos.Y - rootPos.Y), (int)frameworkElement.ActualWidth, (int)frameworkElement.ActualHeight); } catch { } } info.LogicalTreeIndex = logicalIndex.ToArray(); info.VisualTreeIndex = visualIndex.ToArray(); return info; }
/// <summary> /// リストの中から参照が一致するインデックスを見つける。 /// </summary> /// <param name="list">リスト。</param> /// <param name="obj">オブジェクト。</param> /// <returns>インデックス。</returns> private static int IndexOf(List<WindowInfo> list, WindowInfo obj) { for (int i = 0; i < list.Count; i++) { if (ReferenceEquals(obj.TargetObject, list[i].TargetObject)) { return i; } } return -1; }
/// <summary> /// インデックスをお互い持ち合う /// </summary> /// <param name="visualInfo">ビジュアル情報</param> /// <param name="info">ロジカルツリー情報</param> static void MutualIndex(WindowInfo[] visualInfo, WindowInfo[] logicalInfo) { List<WindowInfo> faltVisual = new List<WindowInfo>(); ToFlat(visualInfo, faltVisual, false); List<WindowInfo> faltLogical = new List<WindowInfo>(); ToFlat(logicalInfo, faltLogical, false); for (int i = 0; i < faltVisual.Count; i++) { int findIndex = IndexOf(faltLogical, faltVisual[i]); if (findIndex != -1) { faltLogical[findIndex].VisualTreeIndex = faltVisual[i].VisualTreeIndex; } } for (int i = 0; i < faltLogical.Count; i++) { int findIndex = IndexOf(faltVisual, faltLogical[i]); if (findIndex != -1) { faltVisual[findIndex].LogicalTreeIndex = faltLogical[i].LogicalTreeIndex; } } }
/// <summary> /// ツリー構造からフラットなリストに変更 /// </summary> /// <param name="infos">情報</param> /// <param name="list">リスト</param> /// <param name="clearChildren">子をクリアするか</param> static void ToFlat(WindowInfo[] infos, List<WindowInfo> list, bool clearChildren) { foreach (WindowInfo info in infos) { list.Add(info); ToFlat(info.Children, list, clearChildren); if (clearChildren) { info.Children = new WindowInfo[0]; } } }
/// <summary> /// 重複をマージする /// </summary> /// <param name="visualInfo">ビジュアル情報</param> /// <param name="info">ロジカルツリー情報</param> /// <returns>重複を取り除いたビジュアル要素</returns> static WindowInfo[] MergeDuplication(WindowInfo[] visualInfo, WindowInfo[] logicalInfo) { List<WindowInfo> faltVisual = new List<WindowInfo>(); ToFlat(visualInfo, faltVisual, true); List<WindowInfo> faltLogical = new List<WindowInfo>(); ToFlat(logicalInfo, faltLogical, true); for (int i = faltVisual.Count - 1; 0 <= i; i--) { int logicalInfoIndex = IndexOf(faltLogical, faltVisual[i]); if (logicalInfoIndex != -1) { faltLogical[logicalInfoIndex].VisualTreeIndex = faltVisual[i].VisualTreeIndex; faltVisual.RemoveAt(i); } } faltLogical.AddRange(faltVisual); return faltLogical.ToArray(); }