2

创建的 Winusercontrol 由 1 个表单和 1 个面板组成。在用户控件面板的绘制事件上绘制一些文本。在我的应用程序中添加用户控件的引用。

用户控制代码:

bool flag=false;
public void Somthing()
{
  ///some code...
  ///
  flag=true;
}

protected void panel_paint(PainteventArgs e)
{
 if(flag==true)
   //draw some text
}

表格申请代码:

private void frmMain_Load(object sender, EventArgs e)   
{
   usercontrol obj=new usercontrol();
   obj.Somthing();
}

当我创建库对象并调用 Somthing(). 当签入绘画事件标志值将是假的。所以不会绘制任何文本我不知道为什么会重置标志值。

4

4 回答 4

2

也许 Paint 事件在 Form 加载事件之前触发,因此您的标志为 false,您将永远无法添加文本。

尝试将Invalidate()添加到包含面板的用户控件中,以便重新绘制。

public void Somthing()
{
  flag=true;
  this.Invalidate();

  //EDIT: it couldn't be synchronous so force with Update that sends WM_PAINT event
  this.Update();
}
于 2013-05-27T08:08:31.743 回答
1

设置值后使用Invalidate方法调用/触发paint事件:flag

Control.Invalidate()使控件的整个表面无效并导致控件被重绘。

示例代码:

private bool _flag;

public bool Flag
{
    get { return _flag; }
    set
    {
        _flag = value;
        Invalidate();
    }
}

public void Somthing()
{
    ///some code...
    ///
    Flag = true;
}

protected void panel_paint(PainteventArgs e)
{
    if(Flag == true)
        //draw some text
} 
于 2013-05-27T08:12:56.090 回答
0

您应该粘贴完整的表单代码。我将创建另一个构造函数并在创建控件时传递值。也许在表单加载之前触发了一些事件:

bool flag=false;
public void Somthing()
{
  ///some code...
  ///
  flag=true;
}

public void Somthing(bool flagValue)
{
   flag= flagValue;
}
于 2013-05-27T08:06:03.373 回答
0

使标志静态。

static bool flag=false;
public void Somthing()
{
  ///some code...  
  flag=true;
}

protected void panel_paint(PainteventArgs e)
{
 if(flag==true)
   //draw some text
   ///Set here
   flag=false;
}
于 2013-05-27T10:26:32.833 回答