【问题标题】:Visual Studio 2012 DTE change focus to a new solution itemVisual Studio 2012 DTE 将焦点更改为新的解决方案项
【发布时间】:2012-10-11 05:33:24
【问题描述】:

我正在尝试自动将焦点从解决方案资源管理器中的一个 .ProjectItem 更改为另一个 .ProjectItem。我想以编程方式将焦点从一项更改为另一项,但似乎无法弄清楚如何。
这是我到目前为止所拥有的:

dteInstance.Solution.Projects(2).ProjectItems(3).Focus  

我意识到 ProjectItem 上没有 .Focus 属性,但这是我需要做的。因此,在代码中,我位于解决方案中的 ProjectItem 上,我想将焦点设置为但无法单击它或找到将焦点设置在它上面的方法。我可以读取 .Name 等项目属性。如何将焦点设置到 .ProjectItem?
谢谢!

【问题讨论】:

    标签: c# automation visual-studio-2012 envdte


    【解决方案1】:

    递归查询解决方案的所有UIHierarchyItem,找到与你的ProjectItem等价的确切UIHierarchyItem,然后调用UIHierarchyItem.Select()

    UIHierarchyItem uiItem = SolutionHelper.FindHierarchyItem(dteInstance.Solution.Projects(2).ProjectItems(3));
    uiItem?.Select(vsUISelectionType.vsUISelectionTypeSelect);
    
            private static readonly EnvDTE80.DTE2 _applicationObject = 
    (EnvDTE80.DTE2)ServiceProvider.GlobalProvider.GetService(typeof(Microsoft.VisualStudio.Shell.Interop.SDTE));
            
            public static UIHierarchy SolutionExplorerNode
            {
                get
                {
                    return _applicationObject.ToolWindows.SolutionExplorer;
                }
            }
    
            public static UIHierarchyItem FindHierarchyItem(object item)
            {
                ThreadHelper.ThrowIfNotOnUIThread();
                UIHierarchyItems items = SolutionExplorerNode.UIHierarchyItems.Item(1).UIHierarchyItems;
                Stack s = new Stack();
                CreateItemsStack(s, item);
    
                UIHierarchyItem last = null;
                while (s.Count != 0)
                {
                    object o = s.Pop();
    
                    last = null;
                    foreach (UIHierarchyItem child in items)
                    {
                        if (child.Object == o)
                        {
                            last = child;
                            items = child.UIHierarchyItems;
                            break;
                        }
                    }
                }
    
                return last;
            }
    
            private static void CreateItemsStack(Stack s, object item)
            {
                ThreadHelper.ThrowIfNotOnUIThread();
                if (item is ProjectItem)
                {
                    ProjectItem pi = (ProjectItem)item;
                    s.Push(pi);
                    CreateItemsStack(s, pi.Collection.Parent);
                }
                else if (item is Project)
                {
                    Project p = (Project)item;
                    s.Push(p);
                    if (p.ParentProjectItem != null)
                    {
                        CreateItemsStack(s, p.ParentProjectItem);
                    }
                }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-03
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多