.net 属性更改时在设计时重新绘制控件
我有一个.NET(特别是C#)控件,它是RadioButton的一个子类,并且有一个额外的属性来向它添加第二个文本字符串。事实上,属性到底做什么并不重要——重要的是它应该改变控件的外观 在“设计”视图中更改此属性并按enter键时,窗体设计器上的控件不会更改。如果我更改RadioButton上已经存在的属性,控件将使用新文本重新绘制自身。我认为这可能是通过IDesigner类型或属性实现的,但我不知道是什么 如何在更改添加的属性时重新绘制控件?试试看.net 属性更改时在设计时重新绘制控件,.net,.net,我有一个.NET(特别是C#)控件,它是RadioButton的一个子类,并且有一个额外的属性来向它添加第二个文本字符串。事实上,属性到底做什么并不重要——重要的是它应该改变控件的外观 在“设计”视图中更改此属性并按enter键时,窗体设计器上的控件不会更改。如果我更改RadioButton上已经存在的属性,控件将使用新文本重新绘制自身。我认为这可能是通过IDesigner类型或属性实现的,但我不知道是什么 如何在更改添加的属性时重新绘制控件?试试看 someGUIControl.Invalid
someGUIControl.Invalidate();
要使控件重新绘制,请尝试
someGUIControl.Invalidate();
让你的控件重新绘制。可能大多数人不会阅读这些评论,所以我将把它作为一个答案发布 让我用一个非常简单的例子来解释:
public override Color ForeColor
{
get { ... }
set
{
if (_foreColor == value) return;
_foreColor = value;
// Force redraw to show new color in designer instantly
if (DesignMode)
Invalidate();
}
}
请求重新绘制
返回是否在设计器模式下执行此代码。因此,if语句后面的代码将永远不会为用户运行
检查
DesignMode
是可选的,但它可以保持代码干净,不会在运行时导致冗余的方法调用。可能大多数人不会阅读注释,因此我将其作为答案发布
让我用一个非常简单的例子来解释:
public override Color ForeColor
{
get { ... }
set
{
if (_foreColor == value) return;
_foreColor = value;
// Force redraw to show new color in designer instantly
if (DesignMode)
Invalidate();
}
}
请求重新绘制
返回是否在设计器模式下执行此代码。因此,if语句后面的代码将永远不会为用户运行
检查
DesignMode
是可选的,但它可以保持代码干净,不会在运行时导致冗余的方法调用。这有帮助吗?或者这样:@Gareth在setter的末尾调用Invalidate()(根据第二个链接)。这看起来只是一个不必要的(尽管很小)开销,因为它在运行时也会这样做。对仅设计时选项有什么想法吗?使用Component.DesignMode确定是否执行代码@加雷斯:是的,那也行。刚刚下载并查看了.NET源代码,他们在其中也使用了Invalidate(),所以我会坚持下去。这有什么帮助吗?或者这样:@Gareth在setter的末尾调用Invalidate()(根据第二个链接)。这看起来只是一个不必要的(尽管很小)开销,因为它在运行时也会这样做。对仅设计时选项有什么想法吗?使用Component.DesignMode确定是否执行代码@加雷斯:是的,那也行。刚刚下载并查看了.NET源代码,其中也使用了Invalidate(),所以我将继续使用它。