c# - 如何在启用视觉样式的情况下将控件呈现为看起来像 ComboBox?

标签 c# .net winforms

我有一个以 ComboBox 为模型的控件。我想呈现控件,使控件 border 看起来像标准的 Windows ComboBox。具体来说,我已经按照 MSDN 文档进行操作,除了禁用控件时的渲染外,控件的所有渲染都是正确的。

需要说明的是,这是针对启用了视觉样式 的系统。此外,除了禁用控件周围的边框外,控件的所有部分都正确呈现,它与禁用的 ComboBox 边框 颜色不匹配。

我正在使用 VisualStyleRenderer 类。 MSDN 建议对 ComboBox 控件的 TextBox 部分使用 VisualStyleElement.TextBox 元素,但标准的禁用 TextBox 和标准的禁用 ComboBox 绘制略有不同(一个具有浅灰色边框,另一个具有浅蓝色边框)。

如何在禁用状态下正确呈现控件?

最佳答案

我不是 100% 确定这是否是您要查找的内容,但您应该查看 System.Windows.Forms.VisualStyles 命名空间中的 VisualStyleRenderer

  1. VisualStyleRenderer class (MSDN)
  2. How to: Render a Visual Style Element (MSDN)
  3. VisualStyleElement.ComboBox.DropDownButton.Disabled (MSDN)

如果用户没有启用视觉样式(他/她可能正在运行“经典模式”或 Windows XP 之前的操作系统),由于 VisualStyleRenderer 将无法工作,因此您应该始终回退到 ControlPaint 类。

// Create the renderer.
if (VisualStyleInformation.IsSupportedByOS 
    && VisualStyleInformation.IsEnabledByUser) 
{
    renderer = new VisualStyleRenderer(
        VisualStyleElement.ComboBox.DropDownButton.Disabled);
}

然后在画的时候这样做:

if(renderer != null)
{
    // Use visual style renderer.
}
else
{
    // Use ControlPaint renderer.
}

希望对您有所帮助!

关于c# - 如何在启用视觉样式的情况下将控件呈现为看起来像 ComboBox?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2874/

相关文章:

c# - 有很多枚举值有什么坏处吗? (许多 >= 1000)

.net - 使用正则表达式获取给定字符串中 = 后面的值

.net - 使用 .NET SDK 扩展 Azure WebApp

c# - Windows 窗体加载然后退出

c# - 如果用户在文本框中键入内容或以编程方式调用 myTextBox.Text,如何确定是否触发了 "TextChanged"事件

C# Day from Week 选择器组件

c# - 如何在 python 中调试 win32com 调用

c# - .aspx.cs(代码隐藏)或 BLL 或两者中的验证代码?

c# - 注入(inject)一个事件作为依赖

c# - 处理项目时缓冲