【问题标题】:Access the project file structure within the Visual Studio Properties property grid?访问 Visual Studio 属性属性网格中的项目文件结构?
【发布时间】:2009-06-24 20:12:22
【问题描述】:

我正在制作一个将在 VS 拖放设计器中使用的组件。此组件的属性之一需要是项目中文件的包 URI。

我想让事情变得简单一些,在 PropertyGrid 用于我的类型属性的属性编辑器中,检查解决方案,构造 Uris 并将它们呈现给用户以供选择。

这可能吗?如果是这样,我能否获得一些关于如何进行此操作的指针和入门指南?

【问题讨论】:

    标签: visual-studio components projects-and-solutions designer propertygrid


    【解决方案1】:

    这是一个仅用于 WPF 项目的组件吗?那么你可能很幸运。这里写一篇。 http://www.wiredprairie.us/journal/2007/06/pack_syntax_in_wpf.html。或者这个 MSDN 示例可以帮助http://msdn.microsoft.com/en-us/library/aa972152(VS.85).aspx

    【讨论】:

    • 不。那是容易的部分。困难的部分是从属性网格编辑器中与 Visual Studio 项目系统交互。不错的尝试。
    • 你看过 DTE 吗?您使用的是 VB、C# 还是 C++?对于 C#,这是获取环境的方法。使用EnvDTE80; // 或 EnvDTE90 或 EnvDTE,具体取决于您的目标视觉工作室。 // 获取当前运行的 Visual Studio IDE 的实例。对于 8.0 版本 EnvDTE80 dte = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal。 GetActiveObject("VisualStudio.DTE.8.0");
    • 不。好像你知道一些关于它的东西......放一些代码来获取活动项目中的文件。那会很有帮助!
    • 以下是您应该研究的资源:Visual Studio 的自动化和可扩展性msdn.microsoft.com/en-us/library/xc52cke4(VS.80).aspx 自动化对象模型图表msdn.microsoft.com/en-us/library/za2b25t3(VS.80).aspx 自定义和自动化开发环境msdn.microsoft.com/en-us/library/ae3cxw0w(VS.80).aspx
    【解决方案2】:

    我认为这有几个方面。

    1) 您可以为属性创建自己的类型编辑器,以决定如何使用属性网格将属性值呈现给用户。

    为此,您需要创建一个类型编辑器,继承自 UITypeEditor,如下所示。

    public class UriListUIEditor : UITypeEditor
    {
           //Override a couple of methods
    }
    

    查看此 codeproject 文章以查看一个简单示例。 http://www.codeproject.com/KB/edit/flagenumeditor.aspx

    现在,提供您的属性的 EditorType 属性,例如

       [Editor(typeof(Utils. UriListUIEditor ), 
                 typeof(System.Drawing.Design.UITypeEditor))]
        public string Uri 
                 { get;set;
                 }
    

    2) 要在您的项目中迭代解决方案,请获取当前的 DTE 实例

     var dte = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal. GetActiveObject("VisualStudio.DTE.8.0"); 
    

    并遍历所有项目以构建列表或 URI 或任何东西。理想情况下,您可以在上述 UriListUIEditor 的 EditValue 方法中执行此操作。

      foreach (var project in dte.Solution.Projects)
            {
    
            }
    

    希望对你有帮助

    【讨论】:

    • 不幸的是,这有几个问题。首先,GetActiveObject 从 ROT 中获取第一个 VS,这意味着它可能是您正在运行的任何 VS 实例之一。你必须通过 ROT 并得到你需要的那个。其次,一旦你有了你的 DTE,你就可以很好地枚举东西,直到你真正尝试从一个属性中获取一个值,这会抛出一个 SerializableException。
    • 我最终做了类似的事情,只是我必须使用运行对象表来确定要使用哪个 VS 实例。非常感谢您的帮助。我很遗憾现在把它变成维基;我无法回复并接受这个作为答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 2020-03-15
    • 1970-01-01
    • 2021-04-01
    • 2017-11-18
    相关资源
    最近更新 更多