【问题标题】:How to resize a borderless window from top only?如何仅从顶部调整无边框窗口的大小?
【发布时间】:2017-01-04 01:51:54
【问题描述】:

我正在创建一个 WPF 应用程序并希望我的窗口是无边框的,并且还可以从顶部调整大小。

到目前为止我所尝试的

  • 我最初认为这会起作用:

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

    确实得到了一个只有上边框的窗口,但我无法调整它的大小。

  • 然后我尝试WindowChrome.ResizeGripDirection="Top"ResizeMode="CanResizeWithGrip"

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

    这也不起作用(无法从顶部边框调整大小),并且手柄甚至不会出现在顶部。它停留在右下角(不过,我可以用手柄调整大小)。

  • This answer 似乎回答者最初可能已经这样做了,但代码不可用。

  • This answer 有一个指向 blog post 的链接,我不太想尝试它,因为我想要一个没有代码的解决方案。
  • 然后是this answer:

    • 我在使用这种方法时遇到了错误:

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

      “内容”属性设置了多次。

    • 后面有代码:

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

      在构造函数中:

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

      这给了我:

      这可以从各个方向调整大小。我希望它能够从顶部调整大小。 (惊喜:我什至没有将新的chrome 对象分配给任何东西。它是如何工作的?我猜这是另一个问题。


问题

如何制作一个无边框窗口,该窗口只能顶部边框? (最好只使用可以更改颜色的上边框来做到这一点)。

【问题讨论】:

    标签: c# wpf resize borderless


    【解决方案1】:

    您可能成功设置WindowChrome.ResizeBorderThickness 属性以删除除顶部之外的所有边框,例如ResizeBorderThickness="0, 5, 0, 0".

    这可能不是实现您的结果的最干净的方法,但我已经在此处调整了答案:http://www.eidias.com/blog/2014/1/27/restyle-your-window (这是我发现让WindowChrome 工作的最简单方法):

    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>
    

    在需要的地方引用字典(我把它放在 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>
    

    引用所需Window中的样式:

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

    这应该会产生一个看起来像您的最终窗口的窗口,但只能从顶部调整大小(只能抓住顶部调整大小手柄)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-12
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-19
      • 2021-06-18
      相关资源
      最近更新 更多