更改WPF标题栏背景颜色

56

我有一个 WPF Windows 应用程序。我需要更改标题栏的背景颜色。如何实现?


相关链接:https://dev59.com/yGkw5IYBdhLWcg3wUI7x。 - DuckMaestro
1
可能是如何在WPF中为窗口设置边框和标题栏样式?的重复问题。 - StayOnTarget
4个回答

29
在WPF中,标题栏是非客户区的一部分,不能通过WPF窗口类进行修改。您需要操作Win32句柄(如果我记得正确的话)。
这篇文章可能对您有帮助:自定义窗口外观

8
WPF中自定义窗口Chrome的链接已失效。 - Lyle S.
4
@LyleS. 这个链接很好用,也许只是暂时不可用了一会儿。 - Sebastian
2
链接又挂了(再次),可能指的是这个链接 - Yeshurun Kubi

26

以下是一个实现此功能的示例:

  <DockPanel HorizontalAlignment="Stretch"
           VerticalAlignment="Stretch"
           LastChildFill="True">

        <Grid DockPanel.Dock="Right"
          HorizontalAlignment="Right">

            <StackPanel Orientation="Horizontal"
                    HorizontalAlignment="Right"
                    VerticalAlignment="Center">

                <Button x:Name="MinimizeButton"
                    KeyboardNavigation.IsTabStop="False"
                    Click="MinimizeWindow"
                    Style="{StaticResource MinimizeButton}" 
                    Template="{StaticResource MinimizeButtonControlTemplate}" />

                <Button x:Name="MaximizeButton"
                    KeyboardNavigation.IsTabStop="False"
                    Click="MaximizeClick"
                    Style="{DynamicResource MaximizeButton}" 
                    Template="{DynamicResource MaximizeButtonControlTemplate}" />

                <Button x:Name="CloseButton"
                    KeyboardNavigation.IsTabStop="False"
                    Command="{Binding ApplicationCommands.Close}"
                    Style="{DynamicResource CloseButton}" 
                    Template="{DynamicResource CloseButtonControlTemplate}"/>

            </StackPanel>
        </Grid>
    </DockPanel>

在代码后端处理点击事件。

对于MouseDown -

App.Current.MainWindow.DragMove();

最小化按钮 -

App.Current.MainWindow.WindowState = WindowState.Minimized;

对于DoubleClick和MaximizeClick

if (App.Current.MainWindow.WindowState == WindowState.Maximized)
{
    App.Current.MainWindow.WindowState = WindowState.Normal;
}
else if (App.Current.MainWindow.WindowState == WindowState.Normal)
{
    App.Current.MainWindow.WindowState = WindowState.Maximized;
}

3
ApplicationCommands.Close 对我来说不起作用。我在一个命令中使用了 Application.Current.MainWindow.Close();。同时,Grid 没有 DoubleClick 事件,我使用了 MouseLeftButtonDown,并用下面的代码。如果 (e.ClickCount == 2),则执行 Maximize() 方法,否则执行 Application.Current.MainWindow.DragMove() 方法。 - Egemen Çiftci
22
这些代码与要求的标题栏颜色有什么关系?请解释一下! - user74696c
1
你的代码中有几个不完整的部分 - StyleTemplate。它们在哪里定义或声明了? - IAbstract
2
答案不可用,因为它是无用的。 - Kappacake

17

您也可以创建一个无边框的窗口,并自己制作边框和标题栏


11
但是你必须自己构建所有任务栏功能(例如移动、双击最大化/还原大小、双击图标关闭等)。 - Marcel B
是的...但这没什么大不了的,例如DragMove方法使移动变得容易,其余部分都是小菜一碟 ;) - Thomas Levesque
13
我知道...但是自己构建标题栏对我来说感觉像一个不光彩的技巧。(此外,创造相同的外观和感觉是一项相当困难的任务,以我之见) - Marcel B
@MarcelB:这不是什么耍卑鄙手段。像Sushant Kurana上面发布的方法一样,有一个解决方法可以实现你想要的结果。我有几个问题可能需要他澄清。但这并不是什么卑劣的把戏或黑客行为。 - IAbstract

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接