2009-06-08 2 views
4

Gibt es eine Möglichkeit, Scrollbar in winforms für .net kompaktem Framework breiter zu machen? Ich möchte fingerfreundlich sein, aber die Scrollbalken sind sehr schmal für Leute mit nicht kleinen Fingern..NET Compact Framework - Scrollbars breiter machen

EDIT:

Das Problem ist, mit einem in die Bildlaufleisten in Komponenten wie Listview, Datagrid, etc ...

Windows Mobile 6.0, .NET Compact Framework 3.5

Dank.

+0

Ich kenne das kompakte Framework nicht, aber ich nehme an, Sie haben für eine "Dicke" -Eigenschaft überprüft. – ChrisF

+0

@ChrisF: Wo sollte ich nach "Dicke" -Eigenschaft suchen? – TcKs

+0

Ich verwendete "Dicke", wie Sie die "Breite" -Eigenschaft von vertikalen Balken und die "Höhe" -Eigenschaft von horizontalen Balken möchten. – ChrisF

Antwort

2

Ich habe nicht geprüft, dass, weil ich kein Gerät aber Gerüchten zufolge haben muss, dass Sie die Größe pro Regstry Einstellungen ändern können:

[HKEY_LOCAL_MACHINE \ SYSTEM \ GWE]

cyHScr = 13 - Standard Höhe der horizontalen Scrollbar

cxVScr = 13 - Standardbreite von vertikalen Scrollbalken

Mit freundlichen Grüßen

Thomas

+2

Aber es betrifft alle Anwendungen in Gerät. Es kann das UI-Layout anderer Anwendungen beschädigen. – TcKs

+0

Da Bildlaufleisten systemweit verwendet werden und nicht steuernspezifisch sind, müssen Sie Ihre eigenen Steuerelemente mit einer eigenen Bildlaufleiste erstellen. – CaptnCrash

+0

Ich denke, ich bin falsch, überprüfen Sie die ScrollBar-Klasse in System.Windows.Controls.Primitives – CaptnCrash

1

Hier ist meine Meinung dazu ist:

  1. .net (und die cf-Version) können Sie auf der Steuer Sammlung des Datagrid/listbox zugreifen ... so können Sie zur Steuerung dh die bekommen Bildlaufleiste über das Steuerelementarray. Zum Beispiel mydatagrid.Contorls[0] wäre die horizontale Bildlaufleiste. Dies kann per Name getan werden, vielleicht werde ich später eine ausgefeiltere Lösung veröffentlichen.
  2. Sobald Sie das richtige Steuerelement erreicht haben, ist es einfach eine Frage der Aktualisierung der Height-Eigenschaft der Bildlaufleiste, richtig? ... falsch !! Denken Sie daran, dass die Bildlaufleiste ein Element innerhalb des Datagrids/der Listbox ist ... daher wird der ursprüngliche Ort (Malposition) an einem Punkt gesetzt, an dem das Element bei dem Wert initialisiert wird Der Code muss sich mit der Neupositionierung der Position der Bildlaufleiste innerhalb des ursprünglichen Rechtecks ​​befassen.

    myDataGrid.Controls[0].Height = myDataGrid.Controls[0].Height + 60; 
    myDataGrid.Controls[0].Location = new Point(myDataGrid.Controls[0].Location.X, myDataGrid.Controls[0].Location.Y - 60); 
    

Schließlich Dinge zu beachten: Wenn Sie mit der Scrollbar Größe spielen, um, müssen Sie andere Teile des Elements erinnern, hängen von dem Scrollbar, zum Beispiel, wenn die Bildlaufleiste auf einige Zeilen versteckt endet das Gitter, sie sind nicht erreichbar ...

+1

Haben Sie es versucht? Hast du das Problem mit überlackierten Reihen gelöst? – TcKs

+1

Wie wäre es die richtige Art mit der TypeOf der Linq Auswahl: 'foreach (VScrollBar LBAR in dataGrid.Controls.OfType ()) { lBar.Width = w; } ' Ich denke, das wäre viel sauberer als nur über alle Kontrollen (oder meine eigene Antwort mit Reflexion) Iterieren –

0

Sie können Reflexion verwenden. Inspiriert von this link würde mein Code in etwa so aussehen. (Es kann ein bisschen zu vorsichtig sein, aber ich bin nicht so sicher, wie generic dies mit Reflexion wäre zB die VScrollBar nicht für eine TextBox auf diesem Formular gefunden..)

using System.Reflection; 
    //... 
    public static void SetVerticalScrollbarWidth(Control c, int w) 
    { 
     try 
     { 
      var lGridVerticScrollBar = GetNonPublicFieldByReflection<VScrollBar>(c, "m_sbVert"); 
      lGridVerticScrollBar.Width = w; 
     } 
     catch 
     { 
      // fail soft 
     } 
    } 

    public DataGridForm() 
    { 
     SetVerticalScrollbarWidth(dataGrid, 30); 
    } 

    public static T GetNonPublicFieldByReflection<T>(object o, string name) 
    { 
     if (o != null) 
     { 
      Type lType = o.GetType(); 
      if (lType != null) 
      { 
       var lFieldInfo = lType.GetField(name, BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance); 
       if (lFieldInfo != null) 
       { 
        var lFieldValue = lFieldInfo.GetValue(o); 
        if (lFieldValue != null) 
        { 
         return (T)lFieldValue; 
        } 
       } 
      } 
     } 
     throw new InvalidCastException("Error in GetNonPublicFieldByReflection for " + o.ToString()); 
    } 
1

VB Version:

'Increase size of the Vertical scrollbar of your DataGrid' 
For Each vBar As VScrollBar In yourDG.Controls.OfType(Of VScrollBar)() 
    vBar.Width = 25 
Next 

'Increase size of the Horizontal scrollbar of your DataGrid' 
For Each hBar As HScrollBar In yourDG.Controls.OfType(Of HScrollBar)() 
    hBar.Height = 25 
Next 

All das geht Yahoo Ernst.

+0

Wirklich nett approch! Vor allem, weil ich "OfType" nicht kannte – etalon11

+0

Ich weiß, das ist alt, aber immer noch sehr relevant. Wo stellst du diesen Code ein? Hat jemand das zur Arbeit gebracht? – user1500403

+0

'Private Sub Form1_Load (...) // Geben Sie den Code ein:) Ende Sub' So habe ich es funktioniert, hoffe, es wird Ihnen helfen! – Febraiz