2010-10-04 3 views
0

Travailler sur une application Windows Mobile 6.5 et avoir un problème qui, à mon avis, serait traité automatiquement. J'ai un panneau sur le formulaire et sa propriété AutoScroll est définie sur true. Avoir une zone de texte qui affiche un panneau d'entrée sur le focus. Pour tester, je place la zone de texte en dehors du panneau visible pour forcer la barre de défilement. Cliquer dans la zone de texte affiche le panneau d'entrée qui dans son événement EnabledChanged redimensionne le panneau. Comme le réglage du focus sur un contrôle situé en dehors de la zone visible force le panneau à défiler (j'ai testé cela et fonctionne comme prévu), je m'attendrais à ce que lorsque le panneau est redimensionné, il défile vers la texbox ciblée, mais ce n'est pas le cas.Le panneau ne défile pas vers le contrôle de mise au point lorsque le panneau de saisie s'ouvre

Voici un code de démonstration rapide:

public partial class Form3 : Form 
{ 
    public Form3() 
    { 
     InitializeComponent(); 

     panel1.Size = this.ClientRectangle.Size; 

     TextBox t = new TextBox(); 
     t.Size = new Size(100, 20); 
     // put it out of the panel's bounds 
     t.Location = new Point(10, 400); 
     t.GotFocus += new EventHandler(t_GotFocus); 
     t.LostFocus += new EventHandler(t_LostFocus); 
     panel1.Controls.Add(t); 

     t = new TextBox(); 
     t.Size = new Size(100, 200); 
     t.Location = new Point(10,10); 
     panel1.Controls.Add(t); 
    } 

    void t_LostFocus(object sender, EventArgs e) 
    { 
     inputPanel1.Enabled = false; 
    } 

    void t_GotFocus(object sender, EventArgs e) 
    { 
     inputPanel1.Enabled = true; 
    } 

    private void inputPanel1_EnabledChanged(object sender, EventArgs e) 
    { 
     if (inputPanel1.Enabled) 
      panel1.Size = inputPanel1.VisibleDesktop.Size; 
     else 
      panel1.Size = this.ClientRectangle.Size; 
    } 
} 
+0

Probablement, vous voudrez peut-être ajouter un tag "Windows-mobile" à votre question afin que d'autres experts peuvent le remarquer et vous aider :) – Gan

Répondre

0

Le problème est que lorsque le panneau est redimensionné, il ne réadapter pas la position de défilement pour garder le contrôle qui est mise au point visible. Ce que vous devez faire est d'ajuster le AutoScrollPosition de votre panneau de sorte que les limites inférieures du contrôle que vous voulez garder affiché soient visibles, après que la taille du panneau soit changée.

Pour un contrôle unique, il ressemblerait à quelque chose comme ceci:

private void inputPanel1_EnabledChanged(object sender, EventArgs e) 
{ 
    if (inputPanel1.Enabled) 
    { 
      panel1.Size = inputPanel1.VisibleDesktop.Size; 
      panel1.AutoScrollPosition = new Point(0, t.Bounds.Bottom - panel1.Height - panel1.AutoScrollPosition.Y); 
    } 
    else 
      panel1.Size = this.ClientRectangle.Size; 
} 

Lire sur le AutoScrollPosition pour comprendre comment fonctionne les mathématiques.

http://msdn.microsoft.com/en-us/library/system.windows.forms.scrollablecontrol.autoscrollposition.aspx

Réglage du AutoScrollPosition est un peu contre-intuitif.

+0

Autoscroll ne fonctionne pas dans le cadre compact - je l'avais déjà essayé. Sauf si j'avais fait quelque chose de mal, mais l'AutoScrollPosition a toujours fini comme 0, 0. L'avez-vous fait dans .netcf? –

+0

Tous les autoscroll dans le .net cf est d'ajouter des barres de défilement si le contenu du contrôle s'étend au-delà de ses limites. J'ai ajouté plus à mon exemple de code ci-dessus pour faire un peu plus clair. Vous devez calculer vous-même la position du défilement automatique et la définir sur l'événement EnabledChanged du panneau de saisie. J'ai pu le faire fonctionner dans le .net cf – jnosek

Questions connexes