- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 VSTA (Visual Studio for Applications) 为 CorelDraw X6 创建插件(或加载项),因为我喜欢 C# 和 .NET 库。我想在 CorelDraw 工具栏中有一个按钮,因此当用户单击此按钮时会发生一些操作,例如,会显示一个表单。为此,我使用了预定义的解决方案 VSTAGlobal,当我启动 CorelDraw 时,它就在我身边。不幸的是,CorelDraw 中没有官方文档(WTF!!!!!)VSTA,我们取而代之拥有 VBA (Visual Basic for Applications) 文档和 CorelDraw 对象模型。我用谷歌搜索了很多,找到了几个链接:some forum post和 YouTube video tutorial .问题是,那里的两个人都创建了他们的 CustomControl(例如按钮)并简单地将其构建为 *.dll,然后使用 VBA 脚本添加 CustomControl 到 CorelDraw 像这样的工具栏
Sub addLineWidthControl()
Call FrameWork.CommandBars("Standard").Controls. '
AddCustomControl("MyNameSpace.MyCustomControlClass", '
"MyCustomControlAssembly.dll")
End Sub
所以,我的问题是:有什么方法可以仅使用 VSTA 来做到这一点?
附加信息:
例如,在默认解决方案 VSTAGlobal 中,有一个具有 [CgsAddInModule] 属性的 Main 类:
[CgsAddInModule]
public partial class Main
{
private Corel.Interop.VGCore.Application app;
// some other code here...
}
此类有一个构造函数(注意,默认并由 CorelDraw 提供):
[CgsAddInConstructor]
public Main(object _app)
// this constructor probably gets an instance
// of CorelDraw application object.
{
app = _app as Corel.Interop.VGCore.Application;
// will it work if I add some code here?
}
也许这是我应该添加如下内容的地方:
app.FrameWork.CommandBars["Standard"]
.Controls.AddCustomControl("MyCustomControlClass");
我用这最后一行代码做了一些实验。我得到 Controls 的 Count 正在增加,但 MyCustomControl 仍然没有出现在工具栏中。
最佳答案
有一种方法可以只使用 C#(我在 Corel X8 中测试过它,但它应该适用于任何具有 VSTA 的版本)。虽然这是一个两部分的过程。首先,您需要在 Corel 中打开宏管理器并编辑 VSTAGlobal 解决方案。例如,如果你想添加一个按钮和一个 slider ,添加这个方法:
[CgsAddInMacro]
public void Add()
{
string controlAssembly = @"C:\VSTS\ScratchProjects\CoreDrawPoC\CoreDrawPoC\bin\Debug\CoreDrawPoC.dll";
var mySlider = app.FrameWork.CommandBars["Standard"].Controls.AddCustomControl("CoreDrawPoC.MySlider", controlAssembly);
mySlider.Caption = "Border Sizing Slider Caption";
mySlider.ToolTipText = "Border Sizing Slider Tooltip";
var myButton = app.FrameWork.CommandBars["Standard"].Controls.AddCustomControl("CoreDrawPoC.ButtonSample", controlAssembly);
myButton.Caption = "Rectanlge Selector";
mySlider.ToolTipText = "Rectanlge Selector Tooltip";
}
添加此代码后,您需要将解决方案的 .dll 添加到上面列出的文件夹中。打开 Visual Studio 2015 并创建一个新项目(我的项目名为 CoreDrawPoC)。它需要是一个 WPF 用户控件库项目。创建 2 个 .xaml 文件。首先是 slider :
<UserControl x:Class="CoreDrawPoC.MySlider"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:CoreDrawPoC"
mc:Ignorable="d" >
<Slider x:Name="mySlider" Width="100" Minimum=".5" Maximum="10" TickFrequency=".5" IsSnapToTickEnabled="True" ValueChanged="mySlider_ValueChanged"/>
</UserControl>
后面的代码是:
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace CoreDrawPoC
{
/// <summary>
/// Interaction logic for UserControl1.xaml
/// </summary>
public partial class MySlider : UserControl
{
Corel.Interop.VGCore.Application appDraw = null;
public MySlider()
{
InitializeComponent();
}
public MySlider(object app)
{
InitializeComponent();
appDraw = (Corel.Interop.VGCore.Application)app;
}
private void mySlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (appDraw != null && appDraw.ActiveDocument != null && appDraw.ActiveShape != null)
{
double width = appDraw.ConvertUnits((double)e.NewValue, Corel.Interop.VGCore.cdrUnit.cdrPoint, Corel.Interop.VGCore.cdrUnit.cdrInch);
appDraw.ActiveSelectionRange.SetOutlineProperties(width);
}
}
}
}
然后创建按钮:
<UserControl x:Class="CoreDrawPoC.ButtonSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:CoreDrawPoC"
mc:Ignorable="d">
<Button x:Name="buttonSample" Click="buttonSample_Click" Width="24" Height="24" >
<Button.Template>
<ControlTemplate>
<Image Source="C:\CorelIcons\Two.bmp"/>
</ControlTemplate>
</Button.Template>
</Button>
</UserControl>
代码隐藏:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace CoreDrawPoC
{
/// <summary>
/// Interaction logic for ButtonSample.xaml
/// </summary>
public partial class ButtonSample : UserControl
{
Corel.Interop.VGCore.Application appDraw = null;
public ButtonSample()
{
InitializeComponent();
}
public ButtonSample(object app)
{
InitializeComponent();
appDraw = (Corel.Interop.VGCore.Application)app;
}
private void buttonSample_Click(object sender, RoutedEventArgs e)
{
SelectOfType("rectangle");
}
private void SelectOfType(string strType)
{
string strQuery = null;
Corel.Interop.VGCore.ShapeRange srGroup = default(Corel.Interop.VGCore.ShapeRange);
Corel.Interop.VGCore.ShapeRange srTopOnly = default(Corel.Interop.VGCore.ShapeRange);
strQuery = "@type='" + strType + "'";
srGroup = appDraw.ActivePage.Shapes.FindShapes("", 0, true, strQuery);
srTopOnly = appDraw.ActivePage.Shapes.FindShapes("", 0, false, strQuery);
srTopOnly.CreateSelection();
appDraw.ActivePage.Shapes.FindShapes("", 0, false, strQuery).CreateSelection();
//if (srTopOnly.Count == srGroup.Count)
//{
// lblWarning.Visibility = System.Windows.Visibility.Hidden;
//}
//else
//{
// lblWarning.Visibility = System.Windows.Visibility.Visible;
//}
}
}
完成后,您将需要编译代码。此外,您还需要创建图像 C:\CorelIcons\Two.bmp。它只是一个 24x24 的位图,可以随意显示。然后编译项目。您将需要关闭 CorelDraw。
编译成功后,您需要运行 VSTA 宏来添加按钮和 slider 。这个宏只需要运行 1 次!之后,它将直接连接到您的 dll 中的代码。如果您更改 dll 中的任何内容并在 Corel 关闭时更新它,它会更改它。这包括图像。
最后,我从 2 篇博客文章中了解了如何执行此操作,我只是将其更改为向标准命令栏添加一个按钮并使用纯 C#。这些帖子是:
关于c# - 仅使用 VSTA 在 Corel Draw X6 中创建自定义控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23733516/
我曾经非常想将 VSTA(Visual Studio Tools for Applications)用于我一直在开发的应用程序,但有一段时间停止关注它。现在,无论我怎么看,我似乎都找不到任何关于它的新
我最近在 VS2015 中创建了一个新的 SSIS 项目。我添加了一个脚本任务,当我单击“编辑脚本”按钮时。 Visual Studio 打开;然而,没有解决方案 我以管理员身份运行 VS。我已经尝试
自从升级 visual studio 2015 并使用 ssis 后,我们发现 Script Task/Component 的编辑器需要大约 30 秒才能打开。 我看到一些旧帖子建议将“127.0.0
我正在使用 VSTA (Visual Studio for Applications) 为 CorelDraw X6 创建插件(或加载项),因为我喜欢 C# 和 .NET 库。我想在 CorelDra
我需要在我的应用程序中提供脚本功能,允许客户使用我们的对象模型扩展其功能。我希望提供某种带有智能感知的集成 C#/VB.Net 编辑器,但在查看了 AvalonEdit 和 ScintillaNet
我在调用 GetListItems(...) Web 服务方法时遇到异常。我正在使用 Visual Studio Tools for Applications 来自定义 InfoPath 表单。这正在
我是一名优秀的程序员,十分优秀!