天道酬勤,学无止境

如何在Winforms设计器中访问继承的控件(How to access inherited controls in the winforms designer)

问题

我正在制作一些控件,这些控件必须具有相同的外观和一些共同的行为,尽管它们是为不同种类的输入而设计的。 因此,我做了一个继承自UserControl的BaseClass,而我所有的控件都继承自BaseClass。

但是,如果我在设计器中添加了针对BaseClass的控件(如TableLayoutPanel),则在设计继承的类时将无法访问它们。 我看到了TableLayoutPanel,但是即使他是“受保护的”,我也无法通过设计器修改它或将控件放入其中。 我可以通过代码轻松访问它,但是我不想失去使用设计器的能力。

现在,我只是从BaseClass中删除了所有控件,在每个继承的类中添加了布局和所有公共控件,然后使用引用在BaseClass中对其进行操作。 但这一点都不令我满意。 有没有一种方法可以使设计器与继承的受保护成员控件一起使用?

环境:C#、. NET 3.5,Visual Studio 2008

编辑以回答SLaks的建议。 我尝试设置一个属性,尽管我不习惯使用它们,但它似乎不起作用。 这是我尝试的代码:

    public partial class UserControl1 : UserControl
    {
            public UserControl1()
            {
                    InitializeComponent();
            }

            public TableLayoutPanel TableLayoutPanel1
            {
                    get { return tableLayoutPanel1;}
                    set { tableLayoutPanel1 = value;}
            }
    }

    public partial class UserControl2 : UserControl1
    {
            public UserControl2()
            {
                    InitializeComponent();
            }
    }
回答1

当您尝试从设计者的继承控件访问基本控件中声明的TableLayoutPanel时,您正在WinForms中使用一个称为“ Visual Inheritance”的功能。

不幸的是,TableLayoutPanel不支持可视继承:http://msdn.microsoft.com/zh-cn/library/ms171689%28VS.80%29.aspx

这就是为什么TableLayoutPanel在继承的控件中显示为被阻止的原因。

回答2

尝试将此属性添加到面板的定义中(可能有帮助,也可能没有帮助):

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
回答3

您必须自己设计基本控件。 成功重建控件项目后,更改将反映在设计器中。 如果您将成员公开,则可以对其进行编辑,但更改将不会保留。

回答4

尝试为您的控件制作ParentControlDesigner ,重写InternalControlDesigner ,然后返回(designerHost.GetDesigner(tableLayoutPanel) as ControlDesigner)designerHost(IDesignerHost) component.Site.GetService(typeof(IDesignerHost))

回答5

我隐约记得通过将基类放到自己的DLL中并先构建它来解决类似的问题。 我有一个翻找,但找不到项目。 对不起。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何编写自动缩放为系统字体和dpi设置的WinForms代码?(How to write WinForms code that auto-scales to system font and dpi settings?)
    问题 简介:有很多评论说“ WinForms不能很好地自动缩放到DPI /字体设置;切换到WPF”。 但是,我认为它基于.NET 1.1。 看来他们实际上在.NET 2.0中实现自动缩放方面做得很好。 至少根据我们到目前为止的研究和测试。 但是,如果你们当中的某些人知道得更多,我们很乐意听取您的意见。 (请不要打扰我们应该切换到WPF ...这不是当前的选择。) 问题: WinForms中的哪些内容不能正确自动缩放,因此应避免? 程序员在编写WinForms代码时应遵循哪些设计准则,以使其能够很好地自动缩放? 到目前为止,我们已经确定的设计准则: 请参阅下面的社区Wiki答案。 那些不正确或不足吗? 我们还应该采用其他准则吗? 还有其他需要避免的模式吗? 任何其他对此的指导将不胜感激。 回答1 不支持正确缩放的控件: 具有AutoSize = False Label ,并且继承了Font 。 在控件上明确设置Font ,使其在“属性”窗口中以粗体显示。 ListView列的宽度不能缩放。 重写窗体的ScaleControl来代替它。 看到这个答案 SplitContainer的Panel1MinSize , Panel2MinSize和SplitterDistance属性具有MultiLine = True TextBox和Font继承。 在控件上明确设置Font ,使其在“属性
  • 在“设计”视图中显示以编程方式添加到WinForms应用程序中的控件?(Show controls added programmatically in WinForms app in Design view?)
    问题 使用Visual Studio(可以使用任何版本)时,切换回“设计”视图时是否可以通过编程方式(而不是通过“设计”视图)添加控件? 我已经尝试过一些非常简单的事情: public Form1() { AddCtrl(); InitializeComponent(); AddCtrl(); } private void AddCtrl() { this.SuspendLayout(); this.Controls.Add(new TextBox()); this.ResumeLayout(false); this.PerformLayout(); } ...但无济于事。 回答1 设计人员是否运行我的代码? 当表单在设计器中显示时,设计器反序列化表单代码(Form1.Designer.cs或Form1.cs中的第一类),并创建表单基类的实例,反序列化InitializeComponent并创建您在其中声明的控件您的课程并设置其属性。 因此, Constructor的代码将无法运行。 设计器仅创建表单基类的实例,而不查看表单的构造函数。 设计师如何工作的有趣例子 查看下面的代码,并注意以下问题: 在哪里; s? Form1构造方法Form111111 ? 什么是NotDefinedFunction() ? 我怎么能int i = "xxxxxxxxxx" ? 即使创建此类文件
  • 如何获得Visual Studio 2008 Windows窗体设计器来呈现实现抽象基类的窗体?(How can I get Visual Studio 2008 Windows Forms designer to render a Form that implements an abstract base class?)
    问题 我遇到了Windows窗体中的继承控件的问题,并需要一些建议。 我确实对列表(由面板制成的自制GUI列表)中的项目使用基类,并对每个可添加到列表的数据类型使用一些继承的控件。 没问题,但是我现在发现,使基本控件成为抽象类是正确的,因为它具有方法,需要在所有继承的控件中实现这些方法,这些控件可以从内部代码调用base-control,但一定不能也不能在基类中实现。 当我将基本控件标记为抽象时,Visual Studio 2008设计器拒绝加载窗口。 有没有一种方法可以使Designer与抽象的基本控件一起工作? 回答1 我知道必须有一种方法可以做到这一点(而且我找到了一种可以干净利落地做到这一点的方法)。 Sheng的解决方案正是我作为一个临时解决方案提出的,但是在一位朋友指出Form类最终从abstract类继承之后,我们应该能够完成此工作。 如果他们能做到,我们就可以做到。 我们从这段代码转到了问题 Form1 : Form 问题 public class Form1 : BaseForm ... public abstract class BaseForm : Form 这是最初的问题起作用的地方。 如前所述,一位朋友指出System.Windows.Forms.Form实现了一个抽象的基类。 我们能够找到... 更好的解决方案的证明 继承层次结构: 系统对象
  • 从控件的构造函数中检测设计模式(Detecting design mode from a Control's constructor)
    问题 紧接着这个问题,是否有可能从对象的构造函数中检测出是处于设计模式还是运行时模式? 我意识到这可能是不可能的,并且我必须更改我想要的内容,但是现在我对这个特定的问题感兴趣。 回答1 您可以在System.ComponentModel命名空间中使用LicenceUsageMode枚举: bool designMode = (LicenseManager.UsageMode == LicenseUsageMode.Designtime); 回答2 您是否正在寻找这样的东西: public static bool IsInDesignMode() { if (Application.ExecutablePath.IndexOf("devenv.exe", StringComparison.OrdinalIgnoreCase) > -1) { return true; } return false; } 您也可以通过检查进程名称来做到这一点: if (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv") return true; 回答3 组件...据我所知没有DesignMode属性。 此属性由Control提供。 但是问题在于,当CustomControl位于设计器的窗体中时
  • 在面板内的控件顶部绘图(C#WinForms)(Drawing on top of controls inside a panel (C# WinForms))
    问题 我知道这个问题已经被问了好几次了,但是到目前为止,我还没有找到一个好的解决方案。 我有一个带有其他控件的面板。 我想在面板上的所有控件上方画一条线 我遇到了3种类型的解决方案(没有一种能按照我想要的方式工作): 在屏幕上获取桌面DC和绘图。 如果其他应用程序与表单重叠,则会使用它们。 覆盖面板的“ CreateParams”: = protected override CreateParams CreateParams { get { CreateParams cp; cp = base.CreateParams; cp.Style &= ~0x04000000; //WS_CLIPSIBLINGS cp.Style &= ~0x02000000; //WS_CLIPCHILDREN return cp; } } //注意,我也尝试过禁用WS_CLIPSIBLINGS 然后画线OnPaint()。 但是...由于面板的OnPaint在其控件的OnPaint之前被调用,因此内部控件的绘制仅画在该行的顶部。 我见过有人建议使用消息过滤器来侦听WM_PAINT消息并使用计时器,但是我认为此解决方案不是“好的做法”或有效的方法。 你会怎么办 ? 确定X毫秒后,内部控件已完成绘制,并将计时器设置为X毫秒? 此屏幕快照显示了WS_CLIPSIBLINGS和WS
  • 在WinForms应用程序中查找集中控件的首选方法是什么?(What is the preferred way to find focused control in WinForms app?)
    问题 在WinForms中查找当前正在接收用户(键盘)输入的控件的首选/最简单方法是什么? 到目前为止,我已经提出了以下建议: public static Control FindFocusedControl(Control control) { var container = control as ContainerControl; return (null != container ? FindFocusedControl(container.ActiveControl) : control); } 从表单中,可以简单地称为(在.NET 3.5及更高版本中,甚至可以将其定义为表单上的扩展方法)- var focused = FindFocusedControl(this); 这样合适吗 有没有我应该使用的内置方法? 请注意,使用层次结构时,仅对ActiveControl的单个调用是不够的。 想象: Form TableLayoutPanel FlowLayoutPanel TextBox (focused) (formInstance).ActiveControl将返回对TableLayoutPanel的引用,而不是TextBox的引用(因为ActiveControl似乎只返回控件树中的直接活动子级,而我正在寻找叶子控件)。 回答1 如果您已经对Windows
  • 如何强制Visual Studio为aspx / ascx文件重新生成.designer文件?(How do you force Visual Studio to regenerate the .designer files for aspx/ascx files?)
    问题 有时,当我编辑页面或控件时,.designer文件停止使用放置在页面上的新控件进行更新。 我不确定导致这种情况发生的原因,但是我想知道是否有任何方法可以强制Visual Studio重新生成.designer文件。 我正在使用Visual Studio 2008 编辑:对不起,我应该注意到我已经尝试过: 关闭并重新打开所有文件和Visual Studio 在页面上对runat =“ server”控件进行更改删除并重新添加页面指令 回答1 如果打开.aspx文件并在设计视图和html视图之间切换,则将提示VS检查控件并将所有缺少的控件添加到设计器文件中。 在VS2013-15中,“项目”菜单下有一个“转换为Web应用程序”命令。 在VS2013之前,此选项在右键单击上下文菜单中可用于as(c / p)x文件。 完成此操作后,您应该看到您现在有了* .Designer.cs文件,并且可以在控件HTML中使用Design HTML中的控件。 PS:不应在调试模式下完成此操作,因为调试时并非所有内容都被“重新编译”。 有些人还报告了成功的做法(删除.designer.cs文件的备份副本,然后删除.designer.cs文件)。 重新创建一个具有相同名称的空文件。 此答案有很多注释,这些注释添加了有关如何最好地重新创建designer.cs文件的提示。 回答2 好吧
  • VisualStudio2010调试-进程无法访问文件…,因为它正在被另一个进程使用(VisualStudio2010 Debugging - The process cannot access the file … because it is being used by another process)
    问题 我无法使用发布的版本的Visual Studio 2010 Prof.com调试WinForms C#应用程序。 在第二次调试运行后,我收到以下错误消息。 错误9无法将文件“ obj \ x86 \ Debug \ Arrowgrass Reports.exe”复制到“ bin \ Debug \ Arrowgrass Reports.exe”。 该进程无法访问文件“ bin \ Debug \ Arrowgrass Reports.exe”,因为该文件正在被另一个进程使用。 我已经尝试过使用预生成脚本来尝试删除此文件,但是该文件已被Visual Studio锁定。 网上有一些对此的参考,因此这是一个已知问题。 有人有修复程序或有效的解决方法吗? 回答1 我发现这个问题非常容易重现,而对我来说,此修复程序是对Richard Fors答案的一种修改。 如果我在设计器中打开了UserControl,请运行调试器,然后编辑UserControl,后续的重建将失败。 如果在运行调试器之前关闭UserControl,则永远不会收到此错误,因此我只需要确保在单击F5之前关闭设计器窗口即可。 回答2 截至2012年10月,我仍然遇到该问题,因此VS 2010 SP1仍未解决问题。 我所做的,并一直努力的工作是禁用项目中的托管过程。 要禁用托管过程: . Open a project in
  • 如何创建类似资源管理器的文件夹浏览器控件?(How to create an Explorer-like folder browser control?)
    问题 我想在VS2008中使用C#和WinForms,创建一个文件浏览器控件,其外观和行为类似于Windows资源管理器中的左窗格。 令我惊讶的是,默认情况下,.NET不附带此类控件。 理想情况下,我希望其内容与资源管理器中的内容完全相同。 例如,在Windows 7上,它应该显示“收藏夹”和“库”伪文件夹。 当然,如果可以的话,我不想专门为每个Windows版本编写代码。 我浏览了一下,有一些此类控件的示例,但是它们都是手动滚动的,因此无法与资源管理器中的控件100%相同。 有什么方法可以让我简单地重用Explorer控件呢? 或者,如果不是,则可以访问将要显示的项目树? 回答1 Microsoft提供了一个使用C#创建Windows资源管理器样式的界面的演练。 在Code Project和其他站点上也有一些示例。 直接的示例是“资源管理器树”,“我的资源管理器”,“文件浏览器”和“高级文件资源管理器”,但还有其他示例。 从我短暂的眼神看来,Explorer Tree看起来是最好的。 我使用Google中的搜索词windows explorer tree view C#查找这些链接。 回答2 实施这样的控件似乎并不容易。 Explorer适用于外壳项目,而不适用于文件系统项目(例如:控制面板,打印机文件夹等)。 如果您需要实现它,我建议您访问http://msdn
  • 尝试使用C#SpellCheck类(Trying to use the C# SpellCheck class)
    问题 我正在尝试使用C#提供的SpellCheck类(在PresentationFramework.dll中)。 但是,尝试将拼写绑定到文本框时遇到问题: SpellCheck.SetIsEnabled(txtWhatever, true); 问题是我的txtWhat是System.Windows.Forms类型,此函数正在查找的参数是System.Windows.Controls,并且简单转换失败。 我也试图使我的TextBox成为这种类型,但是……不能。 有人知道如何使用此SpellCheck对象吗? (MSDN并没有帮助...) 谢谢 回答1 您必须使用WPF TextBox才能进行拼写检查。 您可以使用ElementHost控件将其嵌入Windows窗体表单中。 它的工作原理与UserControl非常相似。 这是一个您可以直接从工具箱中放下的控件。 首先,您需要Project + Add Reference,然后选择WindowsFormsIntegration,System.Design和WPF程序集PresentationCore,PresentationFramework和WindowsBase。 在您的项目中添加一个新类,并粘贴以下代码。 编译。 将SpellBox控件从工具箱的顶部拖放到窗体上。
  • 如何将ASP.NET网站转换为ASP.NET Web应用程序(How to convert ASP.NET website to ASP.NET web application)
    问题 我有一个ASP.NET 3.5网站(Visual Studio术语),但是该网站在不断发展,并且看起来颇具牛仔特色。 我希望看到它被转换成Web应用程序(命名空间和所有)。 这可以在Visual Studio中轻松完成吗? 如果不是,是否有其他工具可以自动创建所有名称空间等? 回答1 好吧,事实证明,“网站”不存在选项“转换为Web应用程序”。 仅对“ Web应用程序”存在选项“转换为Web应用程序”! [强调我的] 因此,这是交易,要进行转换,您需要: 将新的“ Web应用程序”添加到VS 2008解决方案中(“文件”->“添加”->“新建项目”->“ C#”->“ Web”->“ ASP.NET Web应用程序”)。 然后,将旧“网站”中的所有文件复制到新创建的“ Web应用程序”,并默认覆盖其中创建的所有文件。 下一步是最丑的,您需要“手动”将“网站”中的引用添加到新的“ Web应用程序”中。 我以为VS 2008 PowerCommands玩具会帮我做到这一点,因为它确实会复制其他项目类型的引用,但事实并非如此。 您必须手动进行手动操作,并且如果您具有同一程序集的多个版本(例如我的情况下为AJAXToolkit)或同时具有GAC和本地版本的程序集,则在此步骤中必须谨慎。 继续重复最后一步,并尝试构建“ Web应用程序”。 您将不断收到类似“'
  • WinForm UI组件层顺序(WinForm UI components layer order)
    问题 当我们在WinForms中添加任何UI或容器时,后面添加的组件将超过之前添加的组件,可以说它在更高的层中。 添加组件后如何更改层顺序或组件顺序? 回答1 是在代码中还是在设计器中动态加载组件时? 如果在设计器中,则可以使用“格式”->“订单”->“发送回”和“格式”->“订单”->“置于最前”命令。 右键单击控件时,在上下文菜单中以及在表单设计器中工作时应自动显示的“布局”工具栏中,也可以使用“发送回”和“移到最前面”。 回答2 当您在同一位置放置多个控件时,一个控件将最终放置在顶部,而另一个控件则将放置在下面。通常这是一个小错误的结果,例如错误地使用了锚定和停靠功能来创建可调整大小的窗体但是,在某些情况下,您可能希望重叠控制以获得特定效果。 当控件重叠时,由z-index决定哪个控件最终出现在顶部。本质上,每个控件都存在于其自己独立的编号层中。具有z-index层1的控件将出现在z-index层的控件上方如果它们重叠,则为2。通常,一组控件的z索引由添加控件的顺序决定,因此最后添加的控件始终位于最顶层(z索引为0) 。 但是,您可以更改这些选项。 要确定或设置控件的z-index,可以使用Controls Collection的GetChildIndex()和SetChildIndex()方法。以下是将控件移到z-index的第三层的示例。 Controls
  • 名称“ controlname”在当前上下文中不存在(The name 'controlname' does not exist in the current context)
    问题 我有一个正在使用的Web应用程序(带有VS2005的C#ASP.NET2.0)。 一切工作正常,突然我收到错误消息: Error 1 The name 'Label1' does not exist in the current context 以及我每次在页面代码背后使用控件时的其他43种。 这仅发生在1页上。 好像后面的代码无法识别控件。 另一个有趣的事情是,智能感知也没有选择任何控件。 我试图清理解决方案文件,删除obj文件,从项目中排除文件,然后重新添加它们,关闭VS并重新启动它,甚至重新启动我的计算机,但是这些都不起作用。 回答1 检查@Page指令上文件名和Inherits属性后面的代码,确保它们都匹配。 回答2 我知道这是一个古老的问题,但是我遇到了类似的问题,并希望发布我的解决方案,以防其他人受益。 我在学习使用时遇到了问题: ASP.NET 3.5 C# VS2008 我试图创建一个启用AJAX的页面(如果您不熟悉ScriptManager对象,请参阅该教程)。 我试图通过C#代码访问页面中的HTML元素,但出现错误,指出HTML ID值的标识符“当前上下文中不存在”。 为了解决这个问题,我必须执行以下操作: 1.在服务器上运行 要在C#代码中将HTML元素作为变量访问,必须在aspx文件的HTML元素标记中放置以下值: runat="server"
  • Microsoft Visual Studio和C#:如何以可视方式向控件添加事件?(Microsoft Visual Studio and C#: How to Visually Add Events to Controls?)
    问题 如何使用C#将事件处理程序添加到Microsoft Visual Studio(2008)中的窗体中的控件中? 我可以手动执行此操作,但是可以打开Form的Designer.cs文件,但是找不到通过界面执行此操作的方法。 在带有C ++和MFC的MSVC 6中,您可以右键单击或执行其他操作,然后找到该控件的所有可能事件的列表。 然后选择它,它将弹出一个窗口,让您创建一个与该事件关联的方法。 在VB中,它甚至更容易,您可以在代码中完成操作,并且它在方法下拉列表中列出了所有事件。 但是,我在2008年用C#找不到任何种类的东西。 Intellisense有助于填写正确的方法信息。 但是,它总是在Designer.cs文件中创建方法,而不是应在分类的另一半中创建方法。 回答1 在设计器中,单击感兴趣的控件。 在属性窗口中(按F4键将其调出),应该有一个闪电图标。 单击该图标可将您带到该控件的可用事件列表。 双击事件名称将连接存根处理程序,并转到其背后的代码。 编辑:精明的读者将看到发布的屏幕截图适用于Web应用程序(翻转),但对于winforms应用程序则完全相同。 回答2 您所要做的就是在设计器视图中打开表单/控件,使焦点/选定的控件处于选中状态,打开属性视图,然后移至“事件”选项卡。 双击您有兴趣处理的事件。 替代文字http://img222.imageshack.us
  • .NET中的属性是什么?(What are attributes in .NET?)
    问题 .NET中的属性是什么?它们有什么用?如何创建自己的属性? 回答1 元数据。 有关您的对象/方法/属性的数据。 例如,我可以声明一个名为:DisplayOrder的属性,这样我就可以轻松控制应在UI中显示哪些顺序的属性。 然后,我可以将其附加到类上并编写一些GUI组件,以提取属性并适当地对UI元素进行排序。 public class DisplayWrapper { private UnderlyingClass underlyingObject; public DisplayWrapper(UnderlyingClass u) { underlyingObject = u; } [DisplayOrder(1)] public int SomeInt { get { return underlyingObject .SomeInt; } } [DisplayOrder(2)] public DateTime SomeDate { get { return underlyingObject .SomeDate; } } } 从而确保在使用我的自定义GUI组件时,始终将SomeInt显示在SomeDate之前。 但是,您将看到它们在直接编码环境之外最常用。 例如,Windows Designer广泛使用它们,因此它知道如何处理自定义对象。
  • Winforms问题-创建窗口句柄时出错[重复](Winforms issue - Error creating window handle [duplicate])
    问题 这个问题已经在这里有了答案: “创建窗口句柄时出错” (9个答案) 8年前关闭。 我们在Winform应用程序中看到此错误。 任何人都可以帮助您解释为什么会看到此错误,更重要的是如何解决或避免发生此错误。 System.ComponentModel.Win32Exception: Error creating window handle. at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp) at System.Windows.Forms.Control.CreateHandle() at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible) at System.Windows.Forms.Control.CreateControl() at System.Windows.Forms.Control.OnVisibleChanged(EventArgs e) at System.Windows.Forms.ButtonBase.OnVisibleChanged(EventArgs e) 回答1 您是否已运行Process Explorer或Windows Task Manager来查看GDI对象,句柄
  • WinForms应用程序的正确本地化(Proper localization of a WinForms application)
    问题 我有一个WinForms应用程序,我想将其翻译成多种语言。 但是,我没有本地化WinForms应用程序的经验,并且我发现与此主题非常矛盾的信息。 基本上,我想要的是: 在源代码中,每种语言只需要一个文件该文件在编译时被编译到主应用程序中-构建应用程序后无需附属程序集或外部数据文件用户可以选择语言,我不需要/想要基于操作系统进行自动检测这应该主要包含strings和ints ,还应该包含CultureInfo 我见过的大多数解决方案每个Form和/或外部附属程序集都有一个.resx文件。 我需要自己动手吗? 还是框架中已经有东西? .net Framework 3.5 SP1如果重要)。 编辑: 在大多数情况下,Visual Studio已经为我想要的提供了支持,但是有两个问题。 当我将Form.Localizable设置为true我得到了这个不错的Designer支持,但是每个Form生成一个resx 。 在InitializeComponent中手动覆盖它的想法失败了,因为它是由设计师编写的代码,将被定期覆盖。 从理论上讲,我只想: a)覆盖ComponentResourceManager的创建,以将其指向我的全局resx并 b) ApplyResources的调用更改为将CultureInfo作为第三个参数的重载。 似乎我必须向构造函数添加一个函数调用
  • 在C#Winforms中,是否有一种方法可以在所有控件周围放置虚线边框,并在运行时选择特定控件后显示抓点?(In C# Winforms is there a way to put dotted border around all controls and show grip points upon selection of specific controls at runtime?)
    问题 我在一个团队中工作,该团队在类似于Visual Studio的IDE上为本地客户开发自定义Winform代码。 在我们的代码中,我们重写了用户控件以使我们的任务更轻松,但是我们的大多数控件都派生自基本的C#Winform控件。 我目前需要帮助,以实现所有控件周围的虚线边框,以及Visual Studio提供的夹点类型。 未选择的控件 所选控件 强烈要求此功能,因为它可以帮助对齐而无需对视觉准则进行补偿。 我们目前使用以下方法在所有控件周围实现了深色边框: this.BackColor = Color.Black; this.Height = ComboBox.Height + 4; 这在生成的控件周围放置了一个黑色边框,在上面的代码片段中是一个ComboBox。 一位成员指出,我们正按照Microsoft文档中的说明使用边距和填充:https://msdn.microsoft.com/library/3z3f9e8b(v=vs.110) 但这主要是理论上的,似乎并没有太大帮助。 到目前为止,解决这个问题最接近的方法是在线CodeProject链接: public class MyGroupBox : GroupBox { protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e)
  • page.DataContext不能从父Frame继承吗?(page.DataContext not inherited from parent Frame?)
    问题 我在Frame frame有一个Page page ,具有frame.DataContext = "foo" 。 (page.Parent as Frame).DataContext是"foo" 。 好的 page.DataContext BindingExpression为null (也使用ClearValue强制)。 好的 page.DataContext为null 。 但我期望“ foo”! 为什么DataContext不继承? 据我了解Frame沙箱的内容。 但是我找不到有关此行为的任何文档-有人可以将我指向提及此问题的地方吗? 回答1 要回答有关此行为的文档的问题:这不是Microsoft文档,但是我有几本WPF书籍都提到了这一点。 “ Essential Windows Presentation Foundation”说:(第160-161页) 有两种用于托管可导航内容的有趣模型:隔离托管和集成托管。 使用隔离托管,内容不受信任,并在完全隔离(沙盒)的环境中运行。 这是在系统Web浏览器中作为XAML浏览器应用程序运行时如何托管WPF内容的方式。 为了导航到另一个应用程序或HTML内容, Frame对象支持此隔离的托管模型。 系统根本不支持集成托管,在集成托管中我们希望内容充当应用程序的一部分。 当Frame导航到应用程序内的内容时
  • 如何在不修改继承类(基类)的情况下隐藏类中的继承属性?(How to hide an inherited property in a class without modifying the inherited class (base class)?)
    问题 如果我有以下代码示例: public class ClassBase { public int ID { get; set; } public string Name { get; set; } } public class ClassA : ClassBase { public int JustNumber { get; set; } public ClassA() { this.ID = 0; this.Name = string.Empty; this.JustNumber = string.Empty; } } 在不修改ClassBase情况下如何隐藏属性Name (未显示为ClassA成员)? 回答1 我在这里闻到代码味。 我认为,只有在实现该基类的所有功能时,才应继承该基类。 您正在做的事情并不能真正代表面向对象的原则。 因此,如果要从基础继承,则应实现Name,否则继承方向错误。 您的类A应该是您的基类,并且如果您想要的话,您当前的基类应该从A继承,而不是相反。 但是,不要偏离直接问题。 如果您确实想嘲笑“规则”并想继续选择的道路,请按照以下步骤操作: 约定是实现该属性,但是在调用该属性时会引发NotImplementedException-尽管我也不喜欢。 但这是我个人的观点,并不能改变这一惯例仍然有效的事实。 如果您试图废弃该属性