Pregunta

He creado una forma sencilla prueba con FormBorderStyle = FixedToolWindow por defecto y se añade un botón que cambia entre FixedToolWindow y SizableToolWindow en la prensa ratón.

Cambio de la FormBorderStyle entre estos dos parece producir un efecto extraño que está causando muchos problemas en mi solicitud. El problema es que la ventana parece cambiar de tamaño y no puedo tener eso. Sólo quiero cambiar el borde, necesito el tamaño del formulario a seguir siendo el mismo.

Por ejemplo, aquí está el código del botón:

private void button1_Click(object sender, System.EventArgs e) {
    if(FormBorderStyle == FormBorderStyle.FixedToolWindow) {
        System.Diagnostics.Debug.WriteLine("SWITCHING: FIXED -> SIZABLE");
        FormBorderStyle = FormBorderStyle.SizableToolWindow;
    } else {
        System.Diagnostics.Debug.WriteLine("SWITCHING: SIZABLE -> FIXED");
        FormBorderStyle = FormBorderStyle.FixedToolWindow;
    }
}

Y para depurar utilizo este:

private void Settings_SizeChanged(object sender, System.EventArgs e) {
    System.Diagnostics.Debug.WriteLine(this.Size);
}

Y aquí está la salida al pulsar el botón del interruptor:

SWITCHING: FIXED -> SIZABLE
{Width=373, Height=169}
{Width=383, Height=179}
SWITCHING: SIZABLE -> FIXED
{Width=383, Height=179}
{Width=373, Height=169}

¿Cómo puedo solucionar este comportamiento? Y por "arreglo", es decir, evitar que esto suceda, si es posible. Quiero ser capaz de especificar el tamaño de mi forma y permanecer de esa manera, sin importar el tipo de estilo de borde.

Además, una solución como subclase la clase Form sería la solución perfecta para mí en caso de que alguien como cualquier idea para resolver este problema con un procedimiento de este tipo.

EDIT:
Hice un pequeño video para demostrar el problema. La primera prueba muestra que el tamaño del formulario en realidad no cambia (visualmente), sólo la ubicación de la forma cambia un poco; pero los valores de la propiedad Tamaño cambian, como se puede ver en la salida de depuración. La segunda prueba se verá en la salida de depuración que cambian los valores de las propiedades de tamaño y forma del propio tamaño de la ventana también cambiará.

Por favor, mira aquí:
http://screencast.com/t/0vT1vCoyx2u

¿Fue útil?

Solución

Su problema es con el cambio de ubicación, no el tamaño. Este código resuelve el problema que se ve en el video.

        private void Form1_DoubleClick(object sender, EventArgs e)
        {
            Point _location = this.PointToScreen(this.ClientRectangle.Location);
            if (this.FormBorderStyle == FormBorderStyle.SizableToolWindow)
            {
                this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
            }
            else
            {
                this.FormBorderStyle = FormBorderStyle.SizableToolWindow;
            }
            Point _newloc = this.PointToScreen(this.ClientRectangle.Location);
            Size _diff = new Size(_newloc) - new Size(_location);
            this.Location -= _diff;
        }

Me parece que la cuestión de la forma dictada en movimiento cuando se cambia entre los dos borderstyles es un error en el DWM.

Otros consejos

Sospecho que lo que está sucediendo es que las formas de Windows es mantener el tamaño del cliente (es decir, área interna) de la misma, mientras que los cambios de tamaño de la frontera. Esto es generalmente una buena cosa, ya que garantiza que la ventana todavía puede encajar correctamente el contenido que usted ha puesto en él.

Si desea mantener las mismas dimensiones exteriores, se puede trabajar a su alrededor por el ahorro del tamaño de una variable antes de cambiar el tipo de borde, y luego restaurar de nuevo. Ellos probablemente un ligero parpadeo, sin embargo.

Esto funcionó bien para mí:

    private Size _size;
    private void Form1_DoubleClick(object sender, EventArgs e)
    {
        _size = this.Size;
        if (this.FormBorderStyle == FormBorderStyle.SizableToolWindow)
        {
            this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
        }
        else
        {
            this.FormBorderStyle = FormBorderStyle.SizableToolWindow;
        }
        this.Size = _size;
    }

he tenido este mismo problema. El tamaño cliente cambia cuando se establece el FormBorderStyle pero no parece llegar a poner en la propiedad clientrectangle de inmediato. El código en la lista anterior casi funcionó para mí, pero en lugar de sólo tamaño de la tienda, asegúrese de almacenar ClientSize. Por supuesto, en el ejemplo anterior puede que "esto" era una referencia a ClientSize - No estaba segura. Comprar de todos modos, esto funcionó para mí:

_frmFilter.Height = 300 Dim _size Como Tamaño = .ClientSize _frmFilter.FormBorderStyle = FormBorderStyle.FixedToolWindow _frmFilter.ClientSize = _size

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top