如何确定控件是否允许 C# 中的透明度?

Ele*_*ios 4 .net c# vb.net transparency winforms

在 Windows 窗体技术下,我正在继承Form类并覆盖OnControlAdded事件调用器,我的意图是添加到我的窗体的控件集合中的每个控件都将其Control.BackColor属性设置为Color.Transparentvalue,而不管控件的默认颜色继承已添加到我的表单中。

但是,您可能知道,某些控件(例如ListView不接受透明度)以及在尝试设置Color.Transparent值时,System.ArgumentException会抛出 a 告诉您可以设置透明颜色。

那么,我的问题是:

在 C# 或 VB.NET 中,这将是在运行时确定控件是否允许透明背景颜色 ( Color.Transparent)的正确方法(可能使用反射,或者可能调用 Win32 函数)?...而不是处理指定的异常或switch例如,对案例中的控制类型进行分类。

Rez*_*aei 5

要检查控件是否支持Transparent背景色,您可以GetStyle通过传递使用控件的方法ControlStyles.SupportsTransparentBackColor标志作为输入。

结果是一个bool值,它告诉您控件是否支持该样式。

如果true,则控件接受BackColoralpha 分量小于 255 的 a 来模拟透明度。仅当 UserPaint 位设置为 true 并且父控件从 Control 派生时才会模拟透明度。

该方法是受保护的,因此可以在派生类中访问它。

如果要从控件外部使用它,则需要通过反射调用它:

public static bool GetControlStyle(Control control, ControlStyles flags)
{
    Type type = control.GetType();
    BindingFlags bindingFlags = BindingFlags.NonPublic | BindingFlags.Instance;
    MethodInfo method = type.GetMethod("GetStyle", bindingFlags);
    object[] param = { flags };
    return (bool)method.Invoke(control, param);
}
Run Code Online (Sandbox Code Playgroud)