如何创build一个WPF窗口没有可以通过一个手柄只能resize的边框?

如果您在WPF Window上设置ResizeMode="CanResizeWithGrip" ,则右下angular会显示一个resize的控制点,如下所示:

如果设置WindowStyle="None" ,标题栏将消失,但灰色斜面边缘将保留,直到您设置ResizeMode="NoResize" 。 不幸的是,通过设置这些属性的组合,resize的控制也消失了。

我已经通过自定义Style覆盖了WindowControlTemplate 。 我想自己指定窗口的边框,而且我不需要用户能够从四面调整窗口大小,但是我确实需要resize。

有人可以详细说明一个简单的方法来满足所有这些标准吗?

  1. 除了我在ControlTemplate指定的Window之外, Window没有边框。
  2. 在右下angular有一个工作resize的抓地力。
  3. 没有标题栏。

如果在Window上设置了AllowsTransparency属性(即使没有设置任何透明度值),边框消失,只能通过手柄resize。

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

结果如下所示:

我试图用WindowStyle="None"来创build一个无边界的窗口,但是当我testing它时,似乎在顶部显示一个白色的条,经过一些研究,似乎是一个“调整边界”,这里是一个图像黄色):

挑战

经过对互联网和许多非XAML解决scheme的研究之后,我发现所有的解决scheme都是在C#和大量的代码行中的代码,我在这里间接find了解决scheme: 最大自定义窗口丢失阴影效果

 <WindowChrome.WindowChrome> <WindowChrome CaptionHeight="0" ResizeBorderThickness="5" /> </WindowChrome.WindowChrome> 

注意 :您需要使用.NET 4.5框架,或者如果您使用的是旧版本,请使用WPFShell,只需引用shell,然后使用Shell:WindowChrome.WindowChrome

我使用Window的WindowChrome属性,如果你使用这个白色的“调整边框”消失,但你需要定义一些属性才能正常工作。

CaptionHeight:这是标题区域(标题栏)的高度,允许Aero快照,双击行为作为一个标准的标题栏。 设置为0(零)使button工作。

ResizeBorderThickness:这是窗口边缘的厚度,可以调整窗口的大小。 因为我喜欢那个数字,所以我把5放到了5,因为如果你把零放大,它很难调整窗口的大小。

使用这个简短的代码后,结果是这样的:

解决方案

而现在,白色的边框消失了,没有使用ResizeMode="NoResize"AllowsTransparency="True" ,它也在窗口中显示一个阴影。

后来我会解释如何使用简单和短代码很容易地工作button(我没有使用button的图像),新的和我认为我可以发布到codeproject,因为在这里我没有find的地方发布教程。

也许还有另一个解决scheme(我知道像我这样的noobs有困难和困难的解决scheme),但这对我个人的项目是有效的。

这是完整的代码

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

谢谢!

虽然接受的答案是非常真实的,但只要指出AllowTransparency有一些垮台。 它不允许显示子窗口控件,即WebBrowser,并且它通常强制渲染软件,这可能会产生负面的性能影响。

虽然有更好的工作。

当你想创build一个没有可resize的边框的窗口,并且能够容纳一个WebBrowser控件或者一个指向一个URL的Frame控件时,你就不能使用该控件的内容。

我发现一个解决方法,虽然; 在窗口中,如果将WindowStyle设置为None,将ResizeMode设置为NoResize(与我一起,您将仍然可以resize),然后确保您有UNCHECKED AllowsTransparency您将有一个无边框的静态大小的窗口,并将显示浏览器控制。

现在,你可能仍然希望能够resize? 那么我们可以通过互通电话来达到这个目的:

  [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); } 

瞧,WPF窗口没有边界,仍然可移动和可resize,而不会像WebBrowser控件兼容性

在这里示例:

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