gpt4 book ai didi

visual-studio - 如何使用 UITypeEditor 为 Visual Studio 创建一个简单的自动化扩展器

转载 作者:行者123 更新时间:2023-12-01 02:00:07 26 4
gpt4 key购买 nike

在 Visual Studio 中,当您在解决方案资源管理器中选择项目或项目项时,有时您可能希望将自定义属性添加到属性窗口(按 F4 时弹出的窗口)。此外,要填写这些属性的值,我需要添加一个按钮来弹出一个表单,这样我就可以在设计时从用户那里收集信息。

什么是最简单的实现,以便我可以开始?如何使用 UITypeEditAttribute 创建用户界面以某种方式收集值?

最佳答案

这是我能想到的最简单的实现。

由于这是一个高级主题,因此暗示您在开始实现之前对完成所有步骤感到满意(这些都是常见的编程任务)。

如果有任何不清楚的地方,请发表评论,我会尽量简化。请注意,这被配置为在 Visual Studio 中为 Visual C# 文件创建自定义属性。当您运行或调试 Visual Studio 包并单击任何 .cs 文件时,自定义属性应显示在属性窗口中。提供的评论是必需的说明。

enter image description here

  1. 创建一个 Visual Studio 包。
  2. 创建一个接口(interface)来实现您希望添加到属性页的自定义属性。
  3. 创建一个实现自定义属性接口(interface)的类,并用属性装饰自定义属性。
  4. 创建实现 IExtenderProvider 接口(interface)并覆盖 GetExtenderCanExtend 方法的类。
  5. 创建一个继承自 UITypeEditor 的新类并覆盖 GetEditStyleEditValue 方法。

让我们开始吧。

1.在 Visual Studio 中创建包。

Package.cs

// ... 
public sealed class ThePackage : Package
{
private DTE2 Host;
private ObjectExtenders _extensionManager;
private MyExtenderProvider _extenderProvider;
protected override void Initialize()
{

Host = (DTE2)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(SDTE));
_extenderProvider = new MyExtenderProvider();

_extenderProviderCookie = Host.ObjectExtenders.RegisterExtenderProvider(VSConstants.CATID.CSharpFileProperties_string,
"MyExtenderProvider", _extenderProvider);
}
protected override void Dispose(bool disposing)
{
Host.ObjectExtenders.UnregisterExtenderProvider(_extenderProviderCookie);
_extenderProvider = null;
base.Dispose(disposing);
}
}

<强>2。创建实现所需自定义属性的类。

[ComVisible(true)] // Important!
public interface IMyDynamicExtender
{
String NewProperty { get; set; }
}

3.创建一个实现自定义属性接口(interface)的类。

[ComVisible(true)] // Important!
public class NewPropertyExtender : IMyDynamicExtender, IDisposable
{
// These attibutes supply the property with some information
// on how to display and which UITypeEditor to use.
[DisplayName("New Property")]
[Category("New")]
[Description("Specifies the new property")]
[Editor(typeof(CustomUiTypeEditor), typeof(UITypeEditor))]
public String NewProperty { get; set; }
private readonly IExtenderSite _extenderSite;
private readonly int _cookie;
private bool _disposed;

public NewPropertyExtender(IExtenderSite extenderSite, int cookie)
{
_extenderSite = extenderSite;
_cookie = cookie;
}

public void Dispose()
{
Dispose(true);
// take the instance off of the finalization queue.
GC.SuppressFinalize(this);
}

private void Dispose(bool disposing)
{
if (_disposed) return;
if (disposing && _cookie != 0)
{
_extenderSite.NotifyDelete(_cookie);
}
_disposed = true;
}
}

4.创建实现 [IExtenderProvider] 接口(interface)的类并覆盖 [GetExtender] 和 [CanExtend] 方法。

public class MyExtenderProvider : IExtenderProvider
{
private IMyDynamicExtender _extender;
public object GetExtender(string extenderCatid, string extenderName,
object extendeeObject, IExtenderSite extenderSite,
int cookie)
{
return _extender = CanExtend(extenderCatid, extenderName, extendeeObject) ?
new NewPropertyExtender(extenderSite, cookie) : null;
}

public bool CanExtend(string extenderCatid, string extenderName, object extendeeObject)
{
// Some implementation will be here in the real world.
return true;
}
}

5.创建一个继承自 [UITypeEditor] 的新类并覆盖 [GetEditStyle] 和 [EditValue] 方法。

public class CustomUiTypeEditor : UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}

public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
// Use the result of a dialog or something else here.
return "HELLO WORLD";
}
}

关于visual-studio - 如何使用 UITypeEditor 为 Visual Studio 创建一个简单的自动化扩展器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32699359/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com