gpt4 book ai didi

c# - 我的用户控件应该只添加到某种类型的控件

转载 作者:行者123 更新时间:2023-12-05 04:39:09 25 4
gpt4 key购买 nike

我怎样才能使我的用户控件只能添加到某种类型的控件中(在我的例子中,特别是 SplitContainer )?

最佳答案

你需要注意一些事情:

  1. 控件的工具箱项行为
  2. 控件的设计器行为
  3. 控件的运行时运行时行为(可选)

当您将控件从工具箱放到设计图面上时,您应该防止它被放到不需要的控件上;这是CreateComponents的责任ToolBoxItem 的方法分配给控件的类。

将控件添加到设计表面后(例如在所需的父级中),然后您需要防止将其拖到不需要的控件上;这是CanBeParentedTo的责任ControlDesigner 的方法分配给控件的类。

最后,您甚至可能希望在运行时以编程方式防止将其添加到不需要的控件中;在这种情况下,它是 OnParentChanged 的责任控制方法。

示例 - 将控件限制为仅托管在 SplitterContainer 中

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;
[ToolboxItem(typeof(MyControlToolBoxItem))]
[Designer(typeof(MyControlDesigner))]
public class MyControl : Control
{
protected override void OnParentChanged(EventArgs e)
{
if (Parent != null && !(Parent is SplitterPanel))
throw new Exception("You can add this control only to a SplitterContainer.");
base.OnParentChanged(e);
}
}
public class MyControlDesigner : ControlDesigner
{
public override bool CanBeParentedTo(IDesigner parentDesigner)
{
if (parentDesigner.Component is SplitterPanel)
return true;
else
return false;
}
}
public class MyControlToolBoxItem : ToolboxItem
{
protected override IComponent[] CreateComponentsCore(IDesignerHost host,
System.Collections.IDictionary defaultValues)
{
if (defaultValues.Contains("Parent"))
{
var parent = defaultValues["Parent"];
if (parent != null && parent is SplitterPanel)
return base.CreateComponentsCore(host, defaultValues);
}
var svc = (IUIService)host.GetService(typeof(IUIService));
if (svc != null)
svc.ShowError("You can drop this control only over a SplitterContainer.");
return null;
}
}

关于c# - 我的用户控件应该只添加到某种类型的控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70465260/

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