Announcement

Collapse
No announcement yet.

TreeView in Win7-Look darstellen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TreeView in Win7-Look darstellen

    Hallo zusammen,

    ich möchte meinen TreeView (System.Windows.Forms.TreeView) so darstellen lassen, wie er in Win7 aussieht.
    Ich habe dazu auch ein Beispiel gefunden, das auf unzähligen Seiten immer wieder erwähnt wird und in meiner kleinen Testanwendung auch wirklich funktioniert.

    Hier der Code:
    [highlight=vb.net]
    Imports System.Runtime.InteropServices
    Public Class Form1


    Public Sub New()
    Me.Font = System.Drawing.SystemFonts.IconTitleFont


    InitializeComponent()


    SetWindowTheme(treeView1.Handle, "explorer", Nothing)
    'SetWindowTheme(listView1.Handle, "explorer", Nothing)


    Me.treeView1.HotTracking = True
    Me.TreeView1.FullRowSelect = True
    End Sub


    <DllImport("uxtheme.dll", CharSet:=CharSet.Unicode, ExactSpelling:=True)> _
    Private Shared Function SetWindowTheme(ByVal hWnd As IntPtr, ByVal appName As String, ByVal partList As String) As Integer
    End Function






    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load


    Me.treeView1.ExpandAll()



    End Sub




    End Class
    [/highlight]

    Wie gesagt, dort funktioniert es wunderbar.

    Versuche ich jetzt aber das ganze in meiner großen Anwendung, scheint es schlicht ignoriert zu werden und der TreeView sieht aus wie eh und je (diese hässlichen + und - Zeichen)
    In meiner Anwendung wird ein ein angepasster TreeView erzeugt, der einfach von System.Windows.Forms.TreeView erbt, der dann nochmal weitervererbt wird (fragt mich nicht wer auf die Idee gekommen ist, das war vor meiner Zeit).
    Ich habe gedacht, wenn ich jetzt zwischen dem ersten Erben und System.Windows.Forms.TreeView noch eine Klasse schalte, die die oben genannte Funktionalität hat, dann würde das auch funktionieren, ist aber scheinbar nicht so

    Hier die Klasse:
    [highlight=vb.net]
    Imports System.Runtime.InteropServices
    Public Class NewTreeView
    Inherits System.Windows.Forms.TreeView
    '<DllImport("uxtheme.dll", CharSet:=CharSet.Unicode)>
    'Private Shared Function SetWindowTheme(hWnd As IntPtr, pszSubAppName As String, pszSubIdList As String) As Integer
    'End Function


    Declare Function SetWindowTheme Lib "uxtheme.dll" ( _
    ByVal hWnd As IntPtr, _
    Optional ByVal pszSubAppName As String = "", _
    Optional ByVal pszSubIdList As String = "") As Int32

    'Public Sub New()
    ' SetWindowTheme(Me.Handle, "Explorer", Nothing)
    'End Sub



    Protected Overrides Sub CreateHandle()
    MyBase.CreateHandle()
    Try
    SetWindowTheme(Me.Handle, "Explorer", Nothing)
    Catch ex As Exception
    MessageBox.Show(ex.ToString)
    End Try
    End Sub
    End Class
    [/highlight]
    Ich habe auch schon verschiedenste Variationen durch, aber immer mit dem selben Ergebnis: es interessiert den TreeView nicht.

    Ich hab auch mal die beiden erbenden Klassen angehangen.
    Vielleicht sehen ja fremde Augen, was ich übersehe oder falsch mache.

    Danke schon mal für Eure Hilfe
    Andi
    Attached Files

  • #2
    Du willst den explorer Look des TreeViews darum must du als SubAppName auch "explorer" übergeben. Und nun, spot the difference, schau mal was du jeweils in der funktionierenden und der nicht funktionierenden Version übergeben hast

    Comment


    • #3
      An der Schreibweise des SubAppName liegt es nicht. Ob ich nun "explorer", "Explorer" oder "EXPLORER" übergebe macht keinen Unterschied.
      Ich habe auch mal den Aufruf der dll und der Methode "SetWindowTheme", wie in der funktionierenden Version auf die Form verschoben (ins New) wo einer meiner TreeViews ist. Damit mir kein Tippfehler dazwischen funkt, habe ich den Code der funktionierenden Version mit Copy&Paste eingefügt. Ändern tut das alles nichts.

      Comment


      • #4
        Ich muss ganz ehrlich sagen, ich weiß nicht warum, aber jetzt geht es.
        Und was habe ich geändert? Ich habe das verwendete Framework von 4.0 auf 4.5 gesetzt und im App-Manifest folgendes eingetragen, bzw. die Kommentarklammern entfernt:

        [highlight=xml]
        <dependency>
        <dependentAssembly>
        <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common-Controls"
        version="6.0.0.0"
        processorArchitecture="*"
        publicKeyToken="6595b64144ccf1df"
        language="*"
        />
        </dependentAssembly>
        </dependency>
        [/highlight]

        Selbiges hatte ich auch mal mit 4.0 versucht, ging dort aber nicht.
        Funktioniert das ganze grundsätzlich nur mit 4.5 ? Oder hab ich da jetzt einfach Glück gehabt? Ich verstehe es nicht...
        Bekomme ich da jetzt Probleme beim Verteilen an die Benutzer?

        Comment

        Working...
        X