Question

Selon MSDN

form.RightToLeftLayout = True;
form.RightToLeft = ifWeWantRTL() ? RightToLeft.True : RightToLeft.False;

suffit pour afficher le contenu du formulaire dans les langues RTL.

Mais le placement des contrôles n'est reflété que pour les contrôles immédiatement sur le formulaire,
ceux qui se trouvent dans un GroupBox ou un Panel ne sont pas mis en miroir , à moins que je ne les mette sur un tableau TableLayoutPanel ou un composant FlowLayoutPanel.

C’est beaucoup de travail manuel pour placer un TableLayoutPanel dans chaque GroupBox, et surtout pour réorganiser les contrôles (un contrôle par cellule de tableau, padding, marge, etc.)

Existe-t-il un moyen plus simple d’utiliser le mirroring pour tous les contrôles?

Ou du moins, comment puis-je éviter l'étape de réorganisation, car le nombre de formulaires est assez complexe?

Modifier : la propriété RightToLeft de chaque contrôle du formulaire est héritée par défaut,
ainsi, les panneaux et les boîtes de groupe ont toujours le paramètre RightToLeft nécessaire.
Néanmoins, j’ai essayé de le réassigner pour eux à la fois par programmation et par designer, cela n’a pas aidé.

Était-ce utile?

La solution

On voit que vous avez un problème assez grave sur vos mains. Jouez avec elle depuis un moment et proposez ce qui suit:

En utilisant une petite récursivité, vous pouvez exécuter tous les contrôles et effectuer la conversion manaul RTL pour les contrôles bloqués dans les panneaux et les boîtes de groupe.

C’est une rapide petite maquette de code que j’ai frappée ensemble. Je suggérerais de mettre ceci dans votre BaseForm (en espérant que vous en avez une) et d’appeler sur le formulaire de base.

private void SetRTL (bool setRTL)
{
    ApplyRTL(setRTL, this);
}

private void ApplyRTL(bool yes, Control startControl)
{
    if ((startControl is Panel ) || (startControl is GroupBox))
    {
        foreach (Control control in startControl.Controls)
        {
            control.Location = CalculateRTL(control.Location, startControl.Size, control.Size);
        }
    }

    foreach (Control control in startControl.Controls)
        ApplyRTL(yes, control);
}

private Point CalculateRTL (Point currentPoint, Size parentSize, Size currentSize)
{
    return new Point(parentSize.Width - currentSize.Width - currentPoint.X, currentPoint.Y);
}

Autres conseils

Je ne me souviens pas où j'ai vu cette astuce pour la première fois sur le remplacement de CreateParams, mais vous y êtes;) Le moyen le plus rapide et le plus simple consiste à hériter du Panel, de GroupBox ou de Usercontrol. et remplacer la propriété CreateParams

    protected override CreateParams CreateParams
    {
        get
        {
            return Control_RTF(base.CreateParams, base.RightToLeft);
        }
    }

    private CreateParams Control_RTF(CreateParams CP, RightToLeft rightToLeft)
    {
        if (rightToLeft == System.Windows.Forms.RightToLeft.Yes)
            CP.ExStyle = ((CP.ExStyle | 0x400000) | 0x100000);
        return CP;
    }

Selon l'article Visual Studio 2005: développement d'applications Windows Forms en arabe Il ne me reste que deux alternatives

  • continuez d'ajouter TableLayoutPanels ici et là
  • repositionnez moi-même les contrôles enfants sur RTL

C'est vraiment dommage que cela soit ainsi.

Si vous avez une classe dérivée de Control contenant des contrôles enfants (comme un ContainerControl ), vous pouvez ajouter le code suivant pour forcer tous les contrôles enfants à être mis en miroir lorsque le RightToLeftLayout est défini sur true et lorsque le RightToLeft de votre contrôle est défini sur RightToLeft.Yes .

protected override CreateParams CreateParams
{
    get
    {
        CreateParams createParams = base.CreateParams;
        Form parent = this.FindForm();
        bool parentRightToLeftLayout = parent != null ? parent.RightToLeftLayout : false;
        if ((this.RightToLeft == RightToLeft.Yes) && parentRightToLeftLayout)
        {
            createParams.ExStyle |= 0x500000; // WS_EX_LAYOUTRTL | WS_EX_NOINHERITLAYOUT
            createParams.ExStyle &= ~0x7000; // WS_EX_RIGHT | WS_EX_RTLREADING | WS_EX_LEFTSCROLLBAR
        }
        return createParams;
    }
}

protected override void OnRightToLeftChanged(EventArgs e)
{
    base.OnRightToLeftChanged(e);
    RecreateHandle();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top