c# - 将设计师与主装配体分开

标签 c# vb.net visual-studio updates

背景

我正在将 SourceForge 上的 TreeViewAdv(TVA) 项目转换为 vb.net。到目前为止,我已经成功地转换了代码,成功地构建了它,将 dll 的引用添加到新项目中,将控件添加到工具箱中,将控件添加到窗体中,并修改了控件属性。在构建接受 Aga.Controls 命名空间的表单之前,我还将功能编码到表单中。

问题

当我去调试我放置了 TVA 控件的应用程序时,我收到错误:''Aga' is not declared。由于其保护级别,它可能无法访问。' 在对该命名空间的所有调用上。所以,我在 SourceForge 上研究了这个问题,这里有一个线程:https://sourceforge.net/p/treeviewadv/discussion/568369/thread/005e61ef/就是讨论这个问题。据推测,当您看到这样的行为时,有人知道问题出在哪里,但没有分享他们智慧的任何细节。一般的问题是,当在 2010 年的项目中引用 2008 年编译的 dll 时,“VS 2010 要求您将设计器与主程序集分开。”我尝试联系那里的人,但似乎论坛中的任何线程都没有实际事件。这引出了我的第一个问题......

问题

1.) 满怀希望,StackOverflow 上是否有人专门为 treeviewadv 项目成功完成了这项工作?如果是这样,我真的很感激对所做的事情的详细描述,或者对最终结果代码/修复的简短描述。虽然我知道这是极不可能的,但我想我应该先问问有关“如何做”的更一般性问题?

2.) 除了符合第 1 条要求的任何人,是否有人了解这个一般流程并且至少对 TVA 项目有足够的了解并愿意与我一起努力?

2.) 除了 1 和 2,是否有人在任何项目中做过这件事,并且可以相对详细地描述一般过程,和/或指向示例代码?

3.) 除了 1、2 和 3,是否有我可以访问的特别好的资源概述了如何以上述方式更新 VS2008 项目?

免责声明

我知道这个过程可能过于复杂,无法在这里讨论,因此如果需要,我愿意在其他地方进行讨论/努力。如果第 1 类或第 2 类的人可以(回答我的问题/与我一起解决这个问题)并且您认为应该在其他地方进行讨论,请告诉我我们如何相互联系,因为 S.O. 似乎没有正式的机制。如果可以找到答案,我仍然有兴趣在此处发布(或链接)结果以供所有人共享。

最佳答案

这里有更多信息可以解决不同程序集中 Designer 的一般问题。有一些注意事项:首先,我(我们?)不确定与 UI 设计师有关的核心问题。鉴于该项目似乎是一个自定义 TreeView,情况似乎很可能如此,但术语“设计器”可以以更通用的方式用于此控件。第二个警告是,我所要做的只是上面的描述,还没有看到控件的代码。

就是说,我刚刚完成了 UnDo Manager 组件(即它继承自 Component 并位于表单托盘中)。它需要的部分内容是开发人员可以选择表单上要执行撤消操作的控件的方法。布局/构造是这样的:

Imports Plutonix.UIDesigners

Namespace Plutonix.UnDoMgr

Public Class UndoManager
    Inherits Component      
    Implements ISupportInitialize      

    Private _TgtControls As New Collection(Of Control)

    <EditorAttribute(GetType(UnDoControlCollectionUIEditor), _
          GetType(System.Drawing.Design.UITypeEditor))> _
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
    Public Property UnDoTargets() As Collection(Of Control)
        Get
            Return _TgtControls
        End Get
        Set(ByVal value As Collection(Of Control))
            If value IsNot Nothing Then
                _TgtControls = value
            Else
                _TgtControls.Clear()
            End If
        End Set
    End Property
    '...

<EditorAttribute... decoration 指定此组件使用名为 UnDoControlCollectionUIEditor 的特殊设计器.如果您正在转换的项目在一个或多个属性上没有此问题,则该问题可能与UI 设计人员无关。

后来就有了CONtrols集合编辑器的UI编辑器。这是一个单独的类,尽管它在同一个文件中:

  <System.Security.Permissions.PermissionSetAttribute( _
        System.Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> _
Public Class UnDoControlCollectionUIEditor
    Inherits ControlCollectionUIEditor

    Public Sub New()
        MyBase.bExcludeForm = True
        MyBase.bExcludeSelf = True

       ' create a list of supported control TYPES
        typeList.Add(GetType(TextBox))
        '... 9 more lines adding control types to List(of System.Type)
    End Sub
 End Class

几乎所有代码都驻留在基类中ControlCollectionUIEditor它位于不同的程序集(DLL)中。我的组件实际上使用的是本地定义的组件,因此作为测试,我将编辑器更改为使用 ControlCollectionUIEditor。这是我的设计器 DLL 中的基类。标签、面板、GroupBox 等不具有/不需要撤消功能,因此我的设计器免除了它们在设计器中的显示 - 当我使用基类时,它们都会按预期显示在设计器列表中。

所有标准 UI 编辑器(字符串集合编辑器等)都在 NET 程序集中,因此在一个程序集中定义并在另一个(您的/我们的/开发人员)中使用。几年前,我决定将我编写的几个不同的 UIDesigner 放入一个 UIDesigner.DLL(即它们自己的程序集)中,它们运行良好。

除此之外,我对某些细节感到困惑。听起来您正在尝试在转换中使用此 2008 程序集(DLL?)。那是设计师所在的地方吗?如果是这样,它已经在您的 VS 2010 项目的另一个程序集中,那么为什么会出现问题?是否可以通过转换 2008 年程序集中的任何内容来避免整个事情(仍然不清楚其中的内容)。

HTH

编辑

我快速查看了源代码,它至少使用了 1 个 UIDesigner。 TreeViewAdv.Properties.cs定义 NodeControlCollectionEditor作为 NodeControls 的自定义控件集合编辑器属性(property)。编辑在NodeControlsCollection.cs .巧合的是,它所做的正是我的 UnDoManager 所做的:定义哪些控件类型对 CollectionEditor 有效。然后你的东西调用标准的 NET CollectionEditor,我的调用 CodeProject DialogForm 版本。还有一个StringCollectionEditor.cs文件,但我无法判断这是 UI Designer 还是在运行时为用户提供的东西。

既然你有这些代码,你应该能够模仿我上面所做的事情。我还要验证 VS 2010 确实有提到的怪癖。但我也对 2008 年大会上的内容感到困惑。有没有你没有来源的作品?您也可以尝试将安全属性添加到项目中的任何 UI 设计器,因为 CS 版本没有它们,并且引用的消息表示有关“保护级别”的内容。这似乎不太可能有帮助,但既然你正在处理一个怪癖,谁知道......?

此外,这是一个非常雄心勃勃的转换项目!

关于c# - 将设计师与主装配体分开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19908853/

相关文章:

c# - 如何禁用所有 Roslyn 代码分析器?

c# - 每次都使用 session 获取/设置对象属性

c# - 如何在 GeckoFX 中为不同的控件存储不同的 cookie

c# - 如何在 vb.net 中获取 OCX 的位置和文件名

c++ - 如何部署/制作 .exe/发布 Visual Studio DirectX 游戏?

c - 这种没有推送寄存器的交换有多安全?

c# - 为什么文件不能通过 tcp 在 C# 中的客户端和 C 中的服务器之间正确传输(保存?)?

c# - 有没有办法实现对 ref 结构起作用的 TryGet 函数?

.net - IEnumerable 在 COM 中可见,但 ICollection 不可见?

vb.net - VB.NET 中的“List(Of Byte() )' to ' Byte()”