Visual Studio:如何使用 WPF 编写编辑器扩展

2023-11-25

我正在尝试为 Visual Studio 编写一个编辑器扩展。我已经下载了 VS SDK 并创建了一个新的 Visual Studio Package 项目。但为我创建的虚拟控件是 Windows 窗体控件,而不是 WPF 控件。我正在尝试用 WPF 控件替换它,但效果不太好。无论如何,这可能吗?

另一个相关问题:是否只能编写文本编辑器?我真正想要的是一个看起来更像具有许多不同字段的表单的编辑器。但这似乎不是为了这个而做的? EditorPane 上有很多仅暗示文本编辑器模型的界面。

理想情况下,我想要一个类似于 resx-editor 的编辑器,其中正在编辑的文件具有 xml-内容,而 editor-ui 不是单个文本框,并且生成的 cs 文件作为子文件输出。这可能与编辑器扩展有关吗?


此处详细解释:Visual Studio 2010 中的 WPF – 第 4 部分:直接托管 WPF 内容

因此,如果您使用 Visual Studio SDK 附带的标准可扩展性/自定义编辑器示例,您可以执行以下操作来测试它:

1)修改提供的EditorFactory.cs像这样的文件:

        // Create the Document (editor)
        //EditorPane NewEditor = new EditorPane(editorPackage); // comment this line
        WpfEditorPane NewEditor = new WpfEditorPane(); // add this line

2)创建例如WpfEditorPane.cs像这样的文件:

[ComVisible(true)]
public class WpfEditorPane : WindowPane, IVsPersistDocData
{
    private TextBox _text;

    public WpfEditorPane()
        : base(null)
    {
        _text = new TextBox(); // Note this is the standard WPF thingy, not the Winforms one
        _text.Text = "hello world";
        Content = _text; // use any FrameworkElement-based class here.
    }

    #region IVsPersistDocData Members
    // NOTE: these need to be implemented properly! following is just a sample

    public int Close()
    {
        return VSConstants.S_OK;
    }

    public int GetGuidEditorType(out Guid pClassID)
    {
        pClassID = Guid.Empty;
        return VSConstants.S_OK;
    }

    public int IsDocDataDirty(out int pfDirty)
    {
        pfDirty = 0;
        return VSConstants.S_OK;
    }

    public int IsDocDataReloadable(out int pfReloadable)
    {
        pfReloadable = 0;
        return VSConstants.S_OK;
    }

    public int LoadDocData(string pszMkDocument)
    {
        return VSConstants.S_OK;
    }

    public int OnRegisterDocData(uint docCookie, IVsHierarchy pHierNew, uint itemidNew)
    {
        return VSConstants.S_OK;
    }

    public int ReloadDocData(uint grfFlags)
    {
        return VSConstants.S_OK;
    }

    public int RenameDocData(uint grfAttribs, IVsHierarchy pHierNew, uint itemidNew, string pszMkDocumentNew)
    {
        return VSConstants.S_OK;
    }

    public int SaveDocData(VSSAVEFLAGS dwSave, out string pbstrMkDocumentNew, out int pfSaveCanceled)
    {
        pbstrMkDocumentNew = null;
        pfSaveCanceled = 0;
        return VSConstants.S_OK;
    }

    public int SetUntitledDocPath(string pszDocDataPath)
    {
        return VSConstants.S_OK;
    }

    #endregion
}

当然,您必须实现所有编辑器逻辑(添加接口等)来模仿 Winforms 示例中所做的操作,因为我在这里提供的实际上只是用于纯粹演示目的的最小内容。

注意:整个“内容”仅适用于 Visual Studio 2010(因此您需要确保您的项目引用 Visual Studio 2010 程序集,如果您使用 Visual Studio 2010 从头开始​​启动项目,则应该是这种情况)。可以使用以下方式在 Visual Studio 2008 中托管 WPF 编辑器System.Windows.Forms.Integration.ElementHost.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Visual Studio:如何使用 WPF 编写编辑器扩展 的相关文章

  • 如何在运行时添加到 TreeView 目录

    我有一个TreeView我想允许用户添加和删除子项目 在探索基本功能时 我使用button and a textbox添加此子项 当用户点击button a new TreeViewItem需要创建并设置为我的父项的子项TreeView与t
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • WPF ListView/Gridview 允许用户选择多个项目并将它们分组在一起

    我在 MVVM 应用程序中有一个 WPF ListView GridViwe GridView 绑定到 ViewModel 中的列表 要求是用户应该能够选择网格视图的多行 右键单击它并看到上下文菜单 将这些行组合在一起 选择后 所有这些项目
  • 如何将 IronPython 与 Visual Studio 2008 结合使用

    我尝试过使用 Microsoft 提供的 IronPython 集成扩展 但它不适用于 Visual Studio 2008 是否有适用于 IronPython 的合适 VS 2008 IDE 扩展 对于 IronPython 1 1 支持
  • .Net Standard项目,如何使用System.ServiceModel类

    我已将 PCL 项目转换为 Net Standard 1 5 项目 我已经从 nuget 安装了 System ServiceModel 包 但找不到使用 System ServiceModel 命名空间的方法 任何帮助表示赞赏 安装 Sy
  • 如何枚举控件的所有依赖属性?

    我有一些 WPF 控件 例如 文本框 如何枚举该控件的所有依赖属性 如 XAML 编辑器所做的那样 不需要使用反射 恕我直言 这是一个坏主意 因为框架已经为此提供了实用程序类 但它们并不明显找到 以下是基于这篇文章的答案 枚举绑定 http
  • 使用 Visual Studio 调试器在值更改时中断

    有没有办法在变量上放置监视 并且仅在该值发生变化时让 Visual Studio 中断 这将使发现棘手的国家问题变得更加容易 这可以做到吗 断点条件仍然需要设置断点 我宁愿设置一个监视并让 Visual Studio 在状态更改时设置断点
  • Visual Studio:同时调试多个项目?

    是否可以在 Visual Studio 中同时调试多个项目 我知道您可以从解决方案属性中选择多个启动项目 但是断点是如何处理的 如果两个项目使用同一个类 它的两个不同实例 并且我因其中的断点而停止 那么它只会阻止一个程序还是同时阻止两个程序
  • Visual Studio 扩展找不到所需的程序集

    我为 Visual Studio 2013 编写了一个扩展 因为该死的组合框错误 https stackoverflow com questions 7800032 cancel combobox selection in wpf with
  • Visual Studio 2013 中的内存分析

    我想探索如何在我的应用程序中分配内存 我有 C 控制台应用程序并使用 Visual Studio 2013 Professional I go to Analyze gt 性能和诊断并选择 NET内存分配 结果我得到以下总结 图表中每次CP
  • Blazor WebAssembly 项目无法引用 NETCore 类库

    我尝试从 Blazor WebAssembly 项目引用类库 但收到一条错误 指出 Blazor WebAssembly 项目无法引用 ASP NET Core 共享框架项目 我尝试将类库目标更改为 Net Framework 但这会破坏它
  • 使用 ICollectionView 过滤 ObservableCollection

    I have ObservableCollection绑定到dataGrid现在我想过滤我看到需要使用的呈现数据ICollectionView但我不知道如何添加ICollectionView和我的MVVM图案 我的代码简化如下 public
  • 不将 ViewModel 放置在单独的程序集中有充分的理由吗?

    我正在 WPF 中使用 MVVM 模式开发一个项目 MVVM 的主要优势之一是保持业务逻辑和表示之间的清晰分离 为了测试所有内容实际上的分离程度 周末我将所有 ViewModel 模型和业务逻辑移动到一个单独的 dll 中 exe 被保留为
  • 用 C# 制作 Vista 风格的应用程序

    我正在运行 Windows Vista 并且希望外观看起来像常规 Vista 程序 有没有关于如何构建 Vista 风格应用程序的真正好的教程 文章 我还想学习如何使用本机代码并将其转换为 C 如this http bartdesmet n
  • 文件显示在 Visual Studio 的解决方案资源管理器中,并带有快捷方式图标。这意味着什么?

    我已经下载了FParsec的库源代码 所有文件都带有快捷方式符号 这是什么意思 当该项目添加到该项目时 它被添加为链接Project gt Add Existing Item gt Add as Link 该文件很可能托管在目录结构中的另一
  • WPF根据数据类型设置样式?

    问题就在这里 我将 TreeView 与几种不同类型的对象绑定 每个对象都是一个节点 有些对象有一个名为 IsNodeExpanded 的属性 当然 有些对象则没有 这是我的风格 现在 问题是当绑定不具有此属性的项目时 我们在输出中收到此错
  • WPF:如何避免图像超出 Canvas 的边界?

    我有一个画布作为图像查看器 它的背景用于放置图像 我想在其上面放置另一个图像 所以 场景是这样的
  • 列表框未使用绑定填充

    我正在尝试使用 mvvm 模式将现有程序转换为 c wpf 第一部分是选择要处理的文件的文件夹位置并填充列表框 我在这里找到了一个使用 Mvvm Light 的示例 WPF OpenFileDialog 与 MVVM 模式 https st
  • 在 NUnit 测试中使用 WPF 组件 - 如何使用 STA?

    我需要在 NUnit 单元测试中使用一些 WPF 组件 我通过 ReSharper 运行测试 在使用 WPF 对象时失败并出现以下错误 系统 InvalidOperationException 调用线程必须是 STA 因为许多 UI 组件都

随机推荐

  • 从 formatCurrency 中删除货币符号

    我正在尝试格式化从数据库获取的收入总额 并使用 php 的 NumberFormatter 类和 formatCurrency 方法 但是 我不想用这个打印出实际的欧元 欧元符号 我只想要简单的数字 带有逗号和小数点 例子 1234 56
  • 手电筒相机2 API

    Android Camera2 API 中可以同时使用相机预览和手电筒吗 当我尝试使用时CameraManager setTorchMode String cameraId boolean enabled 当相机未打开时它工作正常 但是当相
  • 将 Javascript 回调传递给 Qml 中的 C++ 调用方法

    在 C 中 我有一个带有可调用函数的类 我想做的是从 QML Javascript 调用该方法 我已经开始工作 并向其传递一个 Javascript 回调 在代码中 我定义我的类如下 class MyObject public QObjec
  • Rails - AJAX 模态对话框?

    我有兴趣学习如何 AJAX 模式对话框 通常 如果我想向网站添加模式对话框 我会在主 JS 文件中添加 jquery UI 对话框代码 并将其绑定到 ID 我相信使用 Rails 我可以创建一个链接 它从服务器获取所有对话框代码 然后打开对
  • 将 TBytes (UTF-16) 转换为字符串的最佳方法是什么?

    在 Delphi 2009 中将声明为 TBytes 的字节数组转换为 unicode 字符串的最佳方法是什么 在我的特定情况下 TBytes 数组已经具有 UTF 16 编码数据 每个字符 2 个字节 由于 TBytes 不存储空终止符
  • 为什么 vscode 从打字稿缓存导入包

    我已经开始使用 cli 生成一个反应本机项目 该应用程序似乎工作得很好 但我注意到导入指向打字稿缓存而不是本地节点模块 我什至没有使用打字稿 IDE vscode 1 19 3 import React Component from rea
  • SwiftUI - 如何检测长按按钮?

    我有一个按钮 当按下它时 它会执行一些操作 但我想修改同一个按钮来检测较长的按下时间 并执行一组不同的过程 如何修改此代码以检测长按 Button action some processes Image systemName circle
  • 为什么 numpy 比 python 慢?如何让代码执行得更好

    我将我的神经网络从纯 python 重新编写为 numpy 但现在它的运行速度甚至更慢 所以我尝试了这两个功能 def d a 1 2 3 4 5 b 10 20 30 40 50 c i j for i j in zip a b retu
  • (远程)状态文件中的 Terraform 和明文密码

    Terraform 存储库上有许多关于此问题的 Git 问题 其中有很多有趣的评论 但截至目前我仍然没有看到此问题的解决方案 Terraform 将纯文本值 包括密码 存储在 tfstate 文件中 大多数用户都需要远程存储它们 以便团队可
  • Kafka Mirror Maker 无法复制 __consumer_offset 主题

    我正在尝试利用镜子制造商来复制 consumer offsets主题与其他主题一起 它给出了如下所述的错误 2018 10 24 16 16 03 802 ERROR 向主题发送消息时出错 consumer offsets 键 16 字节
  • 仅跟踪 iframe 历史记录

    我有一个包含 iframe 的页面 我只想跟踪 iframe 的历史记录 我尝试像这样使用历史对象
  • 动态添加侦听器到 Google 地图标记

    我正在开发一个页面 该页面使用 Javascript httpObject 获取代码并使用它来更新页面上的两个元素 一个谷歌地图和一个列出标记指向的内容的 DIV 那一点效果很好 问题是 当我创建标记时 我通过 for 循环来完成此操作 并
  • 在管道操作符时如何返回可观察的“forkJoin”

    在我拥有这个运行良好的解析器之前 resolve return forkJoin this getData1 this getData2 this getData3 现在我必须做一些实际上行不通的事情 resolve return this
  • 在构建器模式中管理订单的首选方法是什么?

    我创建了一个流畅的构建器样式模式来帮助加载测试数据 某些方法的顺序很重要 并且想知道管理正确顺序的首选方法是什么 我目前有以下情况 using NUnit Framework TestFixture public class DataBui
  • Swing动画运行速度极慢

    我当前使用 Java Swing 运行的动画存在问题 这是一个离散事件模拟 基于文本的模拟工作正常 我只是在将模拟连接到 GUI 输出时遇到问题 对于此示例 我将模拟 10 辆汽车 这些汽车代表的是JPanels我稍后将详细阐述这一点 因此
  • 如何在 Java Swing 中制作带有复选框的列表?

    在 Java Swing 中拥有每个项目都带有复选框的列表的最佳方式是什么 IE 一个 JList 其中每个项目都有一些文本和一个复选框 一个精彩的答案是这样的CheckBoxList 它实现了 Telcontar 的答案 尽管是 3 年前
  • Selenium:使用 Python 获取元素的坐标或尺寸

    我看到有一些方法可以通过 Selenium 的各种 Java 库获取元素的屏幕位置和尺寸 例如org openqa selenium Dimension 其中提供 getSize and org openqa selenium Point
  • LINQ - 序列不包含元素

    我正在使用 LINQ 查询 如下所示 object collection where t gt t id Equals 2 First 我收到错误 序列不包含元素 为什么结果不包含元素时会抛出错误 当没有找到结果时 它不应该返回 null
  • 在 Android 上以编程方式设置 VPN

    我找到了以下代码以编程方式建立新的 VPN 但我不知道如何使用它来创建我的应用程序 VpnService service context getSystemService VPN SERVICE VpnProfile profile Vpn
  • Visual Studio:如何使用 WPF 编写编辑器扩展

    我正在尝试为 Visual Studio 编写一个编辑器扩展 我已经下载了 VS SDK 并创建了一个新的 Visual Studio Package 项目 但为我创建的虚拟控件是 Windows 窗体控件 而不是 WPF 控件 我正在尝试