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?

  1. NÃO ter uma borda na Window além do que eu me especificar num ControlTemplate.
  2. Do tem um aperto de redimensionamento trabalhando no canto inferior direito.
  3. NÃO tem uma barra de título.
Foi útil?

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):

O Desafio

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 : 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 Shell:WindowChrome.WindowChrome vez

Eu usei a propriedade WindowChrome da janela, se você usar isso que brancos desaparece "fronteira de redimensionamento", mas você precisa definir algumas propriedades para funcionar corretamente.

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:

A Solução

E agora, a borda branca desapareceu sem usar ResizeMode="NoResize" e AllowsTransparency="True", também mostra uma sombra na janela.

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

<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>

Obrigado!

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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top