Como criar uma janela WPF sem uma borda que pode ser redimensionada via apenas uma aderência?
-
03-07-2019 - |
Pergunta
Se você conjunto ResizeMode="CanResizeWithGrip"
em um Window
WPF, em seguida, um aperto de redimensionamento é mostrado no canto inferior direito, como abaixo:
Se você definir WindowStyle="None"
bem as desaparece da barra de título, mas os cinzentos restos borda chanfrada até set ResizeMode="NoResize"
. Infelizmente, com esta combinação de propriedades definidas, a alça de redimensionamento também desaparece.
Eu tenho substituído Window
do ControlTemplate
através de um Style
personalizado. Eu quero especificar a borda da janela eu mesmo, e eu não preciso de usuários para ser capaz de redimensionar a janela de todos os quatro lados, mas eu preciso de um aperto de redimensionamento.
Pode alguém detalhadamente uma maneira simples para atender a todos esses critérios?
- NÃO ter uma borda na
Window
além do que eu me especificar numControlTemplate
. - Do tem um aperto de redimensionamento trabalhando no canto inferior direito.
- NÃO tem uma barra de título.
Solução
Se você definir a propriedade AllowsTransparency
na Window
(mesmo sem definir quaisquer valores de transparência) da fronteira desaparece e você só pode redimensionar através da aderência.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="640" Height="480"
WindowStyle="None"
AllowsTransparency="True"
ResizeMode="CanResizeWithGrip">
<!-- Content -->
</Window>
Looks resultado como:
Outras dicas
Eu estava tentando criar uma janela sem bordas com WindowStyle="None"
mas quando eu testei, parece que aparece uma barra branca no topo, depois de algumas pesquisas que parece ser uma "fronteira Resize", aqui está uma imagem (I observou em amarelo):
Depois de alguma pesquisa através da internet, e muitas soluções difíceis XAML não, todas as soluções que eu encontrei foram código por trás em C # e lotes de linhas de código, achei indiretamente a solução aqui: Maximum perde efeito de sombra
<WindowChrome.WindowChrome>
<WindowChrome
CaptionHeight="0"
ResizeBorderThickness="5" />
</WindowChrome.WindowChrome>
Nota ??strong> : Você precisa usar o .NET 4.5 framework, ou se você estiver usando uma versão mais antiga uso WPFShell, referência apenas a casca e uso Eu usei a propriedade CaptionHeight: Esta é a altura da área de legenda (headerbar) que permite o Aero Snap, o comportamento clicando duas vezes como uma barra de título normal faz. Defina esta opção para 0 (zero) para fazer os botões de trabalho. ResizeBorderThickness: Esta é a espessura da borda da janela que é onde você pode redimensionar a janela. Eu coloquei a 5 porque eu gosto desse número, e porque se você colocar de zero a sua difícil para redimensionar a janela. Depois de usar este código curto o resultado é o seguinte: E agora, a borda branca desapareceu sem usar Mais tarde vou explicar como fazer para trabalhar os botões (eu não usou imagens para os botões) facilmente com simples e código curto, Im novo e eu acho que eu posso postar codeproject, porque aqui eu não fiz encontrar o lugar para postar o tutorial. Talvez não há outra solução (eu sei que existem soluções duras e difíceis para noobs como eu), mas isso funciona para meus projetos pessoais. Aqui está o código completo Obrigado! Shell:WindowChrome.WindowChrome
vez
WindowChrome
da janela, se você usar isso que brancos desaparece "fronteira de redimensionamento", mas você precisa definir algumas propriedades para funcionar corretamente.
ResizeMode="NoResize"
e AllowsTransparency="True"
, também mostra uma sombra na janela. <Window x:Class="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:Concursos"
mc:Ignorable="d"
Title="Concuros" Height="350" Width="525"
WindowStyle="None"
WindowState="Normal"
ResizeMode="CanResize"
>
<WindowChrome.WindowChrome>
<WindowChrome
CaptionHeight="0"
ResizeBorderThickness="5" />
</WindowChrome.WindowChrome>
<Grid>
<Rectangle Fill="#D53736" HorizontalAlignment="Stretch" Height="35" VerticalAlignment="Top" PreviewMouseDown="Rectangle_PreviewMouseDown" />
<Button x:Name="Btnclose" Content="r" HorizontalAlignment="Right" VerticalAlignment="Top" Width="35" Height="35" Style="{StaticResource TempBTNclose}"/>
<Button x:Name="Btnmax" Content="2" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,0,35,0" Width="35" Height="35" Style="{StaticResource TempBTNclose}"/>
<Button x:Name="Btnmin" Content="0" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,0,70,0" Width="35" Height="35" Style="{StaticResource TempBTNclose}"/>
</Grid>
Enquanto a resposta aceita é muito verdadeiro, só quero salientar que allowtransparency tem algumas quedas. Ele não permite controles de janela filho para aparecer, ou seja WebBrowser, e, geralmente prestação software forças que podem ter efeitos negativos de desempenho.
Há um trabalho melhor em torno embora.
Quando você quiser criar uma janela sem fronteira que é redimensionável e é capaz de hospedar um controle WebBrowser ou um controle Frame apontou para uma URL que você simplesmente não podia, o conteúdo do referido controle iria mostrar vazia.
Eu encontrei uma solução alternativa embora; Na janela, se você definir o WindowStyle para Nenhum, ResizeMode para noresize (urso com mim, você ainda será capaz de redimensionar uma vez feito), em seguida, verifique se você tem UNCHECKED AllowsTransparency você terá uma janela de tamanho estática sem fronteira e vai mostrar o controle de navegador.
Agora, você provavelmente ainda quero ser capaz de redimensionar certo? Bem o que pudermos para que, com uma chamada de interoperabilidade:
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();
//Attach this to the MouseDown event of your drag control to move the window in place of the title bar
private void WindowDrag(object sender, MouseButtonEventArgs e) // MouseDown
{
ReleaseCapture();
SendMessage(new WindowInteropHelper(this).Handle,
0xA1, (IntPtr)0x2, (IntPtr)0);
}
//Attach this to the PreviewMousLeftButtonDown event of the grip control in the lower right corner of the form to resize the window
private void WindowResize(object sender, MouseButtonEventArgs e) //PreviewMousLeftButtonDown
{
HwndSource hwndSource = PresentationSource.FromVisual((Visual)sender) as HwndSource;
SendMessage(hwndSource.Handle, 0x112, (IntPtr)61448, IntPtr.Zero);
}
E pronto, a janela A WPF sem fronteira e ainda móvel e redimensionável, sem perder compatibilidade com com controles como WebBrowser
Amostra aqui:
<Style TargetType="Window" x:Key="DialogWindow">
<Setter Property="AllowsTransparency" Value="True"/>
<Setter Property="WindowStyle" Value="None"/>
<Setter Property="ResizeMode" Value="CanResizeWithGrip"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Window}">
<Border BorderBrush="Black" BorderThickness="3" CornerRadius="10" Height="{TemplateBinding Height}"
Width="{TemplateBinding Width}" Background="Gray">
<DockPanel>
<Grid DockPanel.Dock="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition Width="50"/>
</Grid.ColumnDefinitions>
<Label Height="35" Grid.ColumnSpan="2"
x:Name="PART_WindowHeader"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"/>
<Button Width="15" Height="15" Content="x" Grid.Column="1" x:Name="PART_CloseButton"/>
</Grid>
<Border HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Background="LightBlue" CornerRadius="0,0,10,10"
Grid.ColumnSpan="2"
Grid.RowSpan="2">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="20"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="20"></RowDefinition>
</Grid.RowDefinitions>
<ResizeGrip Width="10" Height="10" Grid.Column="1" VerticalAlignment="Bottom" Grid.Row="1"/>
</Grid>
</Border>
</DockPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>