如何使.NET TreeView控件具有Windows本地外观?

31

Trees

使用.NET中的TreeView组件时,我得到了左侧树的外观。如何为我的.NET TreeView获取右侧树(Windows原生外观)的外观?
我特别想要的是“三角形”节点句柄和蓝色“气泡”选择方块。

1
这是WPF还是WinForms? - Foole
1个回答

46
你需要使用P/Invoke来调用SetWindowTheme函数,传递树形控件的窗口句柄并将主题设置为"explorer"。
将以下代码粘贴到项目中的新类中,编译并使用此自定义控件代替内置的TreeView控件。

C#:

public class NativeTreeView : System.Windows.Forms.TreeView
{
    [DllImport("uxtheme.dll", CharSet = CharSet.Unicode)]
    private extern static int SetWindowTheme(IntPtr hWnd, string pszSubAppName,
                                            string pszSubIdList);

    protected override void CreateHandle()
    {
        base.CreateHandle();
        SetWindowTheme(this.Handle, "explorer", null);
    }
}

VB.NET:

Public Class NativeTreeView : Inherits TreeView

    Private Declare Unicode Function SetWindowTheme Lib "uxtheme.dll"
        (hWnd As IntPtr, pszSubAppName As String, pszSubIdList As String) As Integer

    Protected Overrides Sub CreateHandle()
        MyBase.CreateHandle()
        SetWindowTheme(Me.Handle, "Explorer", Nothing)
    End Sub

End Class

请注意,这个技巧同样适用于 ListView 控件。


我尝试将那段代码转换为vb.net并进行了测试,但仍然是相同的树形视图。 - illumi
@dave 不,这没问题。 - David Heffernan
重要提示:当我将光标移动到项目上时,它不会像Windows资源管理器一样更改样式,是否有某些SendMessage、P/Invoke或覆盖方法可以解决这个问题? - user5395084
2
@Unknown 你在树形视图控件的哪个部分遇到了黑屏问题? - David Heffernan
1
@Unknown 使用系统主题的整个目的是在所有应用程序中保持一致。如果您想更改控件的绘制方式,您需要自己接管绘制过程。 - David Heffernan
显示剩余11条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接