我做了一个类似vs里控件的界面,是设计时不是运行时,可以往Form窗体拖拽控件,现在想限制控件的移动和大小改变,类似于控件的锁定,在我程序里的设计时应该怎样把一个控件锁定?我发现控件里有一个WindowTarget,和SelectionRules,但他俩都是私有的根本访问不了,SelectionRules里有Locked的一个属性。我就想知道怎样在自己做设计时对控件实现锁定操作

解决方案 »

  1.   

    做一个属性器,用set和get来设定
      

  2.   


    private  bool is_lock;
    public bool Is_lock
    {
    get{return is_lock;}
    set
    {
    is_lock=value;
    if(value)this.locked;
    }}
      

  3.   

    比如你的界面叫from1,你设置的时候就可以写from1.Is_lock=true;
    长宽,位置都可以这么设定
      

  4.   

    控件被锁定后,它的SelectionRules是怎样改变的?控件锁定后,SelectionRules的值是Locked,解锁后是moveable....等等了
      

  5.   

    呃,lock只是打個比方
    private  int width1;
    public int Width1
    {
    get{return width1;}
    set
    {
    width1=value;
    if(value)this.Width=value;
    }}
      

  6.   

    private  int width1;
    public int Width1
    {
    get{return width1;}
    set
    {
    width1=value;
    this.Width=value;
    }}
    if去了
      

  7.   

    可能我表述的不详细,vs里在设计时控件属性栏中有个Locked属性,但代码属性里没有,而我作的这个设计时,控件的锁定属性不知应该怎样处理,关键就在没有
    控件.Locked这个
      

  8.   

            private Size Size1;
            private void UserControl1_Load(object sender, EventArgs e)
            {
                Size1 = this.Size1;
            }
            private void UserControl1_Resize(object sender, EventArgs e)
            {
                this.Size = Size1;
            }
    看看这么写行不,写个_Resize的事件,当大小改变时,返回大小,这样就不变了
      

  9.   

    private void UserControl1_Load(object sender, EventArgs e)
            {
                Size1 = this.Size;
            }
    这个地方改下
      

  10.   

    有办法了,把你的maxsize和minsize的属性都设置为你当前的size就可以了,这样大小就不能变了
      

  11.   

    你另外定义一个文件(配置文件)来保存定义为Lock的控件,在内存中可以建立一个列表来存放哪一个控件是被Lock了。比如:List<keytype> lockList = new List<keytype>();
    keytype可以是用来标识哪一个控件的关键字,比如名称,句柄之类的。当你的设计器需要Lock一个控件的时候就把这个控件的标识记录到lockList中,解除Lock的时候则从lockList中移除。当你使用鼠标等来移动控件的时候可以先检索这个列表,如果被操作的控件已被lockList包含了则不执行操作,如果未包含则正常执行。
    当你关闭设计器的时候把这个列表的内容存放到你的配置文件里以便下次打开的时候再使用。
      

  12.   

    如果你的控件想要实现控件本来没有属性的时候,你可以添加一个组件类,这个类从IExtenderProvider继承,并把这个组件放到窗体上,这样窗体上所有的控件就都会有了这个组件里指定的属性了。参考下面的类: [ProvideProperty("TT", typeof(Control))]
    class testTT : Component, IExtenderProvider
    {
    private Dictionary<Control, string> m_valueList;
    public testTT()
    {
    m_valueList = new Dictionary<Control, string>();
    }
    public bool CanExtend(object target)
    {
    return ((target is Control) && !(target is testTT));
    } [DefaultValue(""), Localizable(true), Editor("System.ComponentModel.Design.MultilineStringEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
    public string GetTT(Control control)
    {
    if (control == null)
    {
    return string.Empty;
    }
    if (this.m_valueList.ContainsKey(control))
    {
    return this.m_valueList[control];
    }
    return "";
    }
    public void SetTT(Control control, string caption)
    {
    this.m_valueList.Add(control, caption);
    }
    }
    当你把这个testTT拖放到窗体上后,在窗体的最下边的显示组件的栏里就会显示出一个新的组件,然后窗体上的所有的控件都会多出一个"testTT1上的TT"这个属性供你属性字符串了。
      

  13.   

    去下载SharpDevelop,这是一个C#开源的IDE。也就是说,他完整包含了如何开发一个窗体设计器的成熟的代码。
      

  14.   

    可以通过反射来做!
    参考 : http://msdn.microsoft.com/zh-cn/library/system.componentmodel.typedescriptor.getproperties(VS.80).aspx