visual ventana titulo redimensionar net mover impedir formulario form color cambiar bordes borde barra c# wpf resize borderless

c# - titulo - ¿Cómo cambiar el tamaño de una ventana sin bordes desde arriba solamente?



mover ventana sin bordes visual basic (1)

Estoy creando una aplicación WPF y quiero que mi ventana no tenga bordes, y también es posible cambiar el tamaño solo desde la parte superior.

Lo que he intentado hasta ahora

  • Inicialmente pensé que esto funcionaría:

    <Window x:Class="WpfApplication3.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Width="200" Height="150" WindowStyle="None" ResizeMode="CanResize" AllowsTransparency="True" BorderThickness="0,5,0,0" BorderBrush="Black"> <Grid Background="Gray" /> </Window>

    Solo tengo una ventana con borde superior, pero no puedo cambiar el tamaño.

  • Luego probé WindowChrome.ResizeGripDirection="Top" con ResizeMode="CanResizeWithGrip" .

    <Window ... WindowStyle="None" ResizeMode="CanResizeWithGrip" AllowsTransparency="True" WindowChrome.ResizeGripDirection="Top" BorderThickness="0,5,0,0" BorderBrush="Black"> ... </Window>

    Esto tampoco funciona (no se puede cambiar el tamaño desde el borde superior), y el agarre ni siquiera aparece en la parte superior. Permanece en la esquina inferior derecha (sin embargo, puedo cambiar el tamaño con el agarre).

  • Esta respuesta parece que el contestador puede haber hecho esto inicialmente, pero el código no está disponible.

  • Esta respuesta tiene un enlace a una publicación de blog , no estoy demasiado ansioso por probarla porque me gustaría una solución sin código.
  • Y luego está esta respuesta :

    • Me sale un error con este enfoque:

      <Window ... WindowStyle="None" ResizeMode="CanResizeWithGrip" AllowsTransparency="False"> <Grid Background="Gray" /> <Setter Property="WindowChrome.WindowChrome"> <Setter.Value> <WindowChrome CornerRadius="0" GlassFrameThickness="1" UseAeroCaptionButtons="False"/> </Setter.Value> </Setter> </Window>

      La propiedad ''Contenido'' está configurada más de una vez.

    • Con código detrás

      <Window ... WindowStyle="None" ResizeMode="CanResize" AllowsTransparency="False"> <Grid Background="Gray" /> </Window>

      En constructor:

      WindowChrome chrome = new WindowChrome(); chrome.CornerRadius = new CornerRadius(0); chrome.GlassFrameThickness = new Thickness(0, 1, 0, 0); chrome.UseAeroCaptionButtons = false;

      Lo que me da:

      Y esto podría cambiar de tamaño desde todas las direcciones. Y solo quiero que se pueda cambiar el tamaño desde arriba. (Sorpresa: ni siquiera asigné el nuevo objeto chrome a nada. ¿Cómo funcionó eso? Esa es otra pregunta, supongo).

Pregunta

¿Cómo hago una ventana sin bordes que solo se puede redimensionar con el borde superior ? (Es mejor si puedo hacer esto solo con un borde superior cuyo color podría cambiarse).


Puede tener éxito al configurar la propiedad WindowChrome.ResizeBorderThickness para eliminar todos los bordes, excepto la parte superior, por ejemplo, ResizeBorderThickness="0, 5, 0, 0" .

Puede que no sea la forma más limpia de lograr el resultado, pero he tenido cierto éxito al adaptar la respuesta aquí: http://www.eidias.com/blog/2014/1/27/restyle-your-window (fue la forma más fácil que encontré para que WindowChrome funcione):

Cree un estilo de ventana personalizado en ResourceDictionary :

<ResourceDictionary x:Class="WpfApplication.WindowStyle" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Style x:Key="CustomWindowStyle" TargetType="{x:Type Window}"> <Setter Property="WindowChrome.WindowChrome"> <Setter.Value> <WindowChrome CaptionHeight="30" CornerRadius="4" GlassFrameThickness="0" ResizeBorderThickness="0, 5, 0, 0" UseAeroCaptionButtons="False" /> </Setter.Value> </Setter> <Setter Property="Window.BorderThickness" Value="0, 5, 0, 0" / </Style> </ResourceDictionary>

Haga referencia al diccionario donde sea necesario (lo puse en App.xaml):

<Application x:Class="WpfApplication1.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfApplication1" StartupUri="MainWindow.xaml"> <Application.Resources> <ResourceDictionary Source="WindowStyle.xaml" /> </Application.Resources> </Application>

Referencia el estilo en la Window requerida:

<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApplication1" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525" Style="{StaticResource ResourceKey=CustomWindowStyle}"> <Grid> </Grid> </Window>

Eso debería producir una ventana que se parece a la final, pero solo se puede redimensionar desde la parte superior (solo se puede tomar el control de cambio de tamaño superior).