WPF 自定义顶部标题栏的实现方式

感谢吕毅,本文主要全是他的思路,哈哈哈。我这里就是简单的做个归纳总结,不讲原理,不讲思路。主打一个拿来主义。

感兴趣的朋友可以直接前往他的文章里看一下,讲的很细致,可以照着做一做。我应该是借鉴了很久了,但是一致都没有正经的整理过。

本文主要是为了贯彻落实拿来就用,能跑就行这两大政策方针,将政策落地。

原文中只是写了windows的title,我的话,日常使用过程中还需要个icon在里面,所以多加了个icon上去。不废话,看代码吧。

首先是页面部分,基本照抄,margin top 略微加了2个像素,看起来协调点:

<WindowChrome.WindowChrome>
    <WindowChrome GlassFrameThickness="0 64 0 0" NonClientFrameEdges="Left,Bottom,Right" />
</WindowChrome.WindowChrome>
<Window.Template>
    <ControlTemplate TargetType="Window">
        <Border Padding="0 30 0 0">
            <Grid x:Name="RootGrid" Background="{TemplateBinding Background}">
                <Border Background="{TemplateBinding Background}" VerticalAlignment="Top" Height="30" Margin="0 -29 140 0">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition />
                            <ColumnDefinition Width="Auto" />
                        </Grid.ColumnDefinitions>
                        <StackPanel Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" Margin="4 0">
                            <!-- Image Control to show the window icon -->
                            <Image Source="{TemplateBinding Icon}" Width="16" Height="16" Margin="4,0"/>
                            <!-- TextBlock for the title -->
                            <TextBlock Foreground="Black" VerticalAlignment="Center" FontSize="12" Margin="0,2,0,0" Text="{TemplateBinding Title}" />
                        </StackPanel>
                        <!-- 这里可以搞点别的小东西 -->
                    </Grid>
                </Border>
                <ContentPresenter />
            </Grid>
        </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="WindowState" Value="Maximized">
                <Setter TargetName="RootGrid" Property="Margin" Value="6" />
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
</Window.Template>

然后是xaml.cs部分, 如果icon图标未指定的话,从ApplicatonIcon里读一下:

public MainWindow()
{
    InitializeComponent();
    if (Icon == null)
    {
        string iconPath = System.Windows.Forms.Application.ExecutablePath;
        Icon icon = System.Drawing.Icon.ExtractAssociatedIcon(iconPath);
        if (icon != null)
        {
            // 创建 BitmapSource
            BitmapSource bitmapSource = Imaging.CreateBitmapSourceFromHIcon(
                icon.Handle,
                Int32Rect.Empty,
                BitmapSizeOptions.FromEmptyOptions());

            // 将 BitmapSource 设置为 Icon
            this.Icon = bitmapSource;
        }
    }
}

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用WPF中的Menu控件来创建自定义菜单栏。以下是创建自定义菜单栏的一些步骤: 1.创建一个Menu控件,并设置它的样式和模板。 2.使用MenuItem控件来添加菜单项,并设置它们的命令或事件处理程序。 3.为菜单项添加子菜单,可以使用MenuItem的Items属性。 4.使用Separator控件来添加分隔符。 5.可以使用ContextMenu控件来创建弹出式菜单。 6.使用命令绑定来处理菜单项的操作。 以下是一个简单的示例,演示如何创建自定义菜单栏: ```xml <Menu Grid.Row="0" Background="{StaticResource MenuBackground}"> <MenuItem Header="_File"> <MenuItem Header="_New" Command="{Binding NewCommand}" /> <MenuItem Header="_Open" Command="{Binding OpenCommand}" /> <Separator /> <MenuItem Header="_Save" Command="{Binding SaveCommand}" /> <MenuItem Header="Save _As" Command="{Binding SaveAsCommand}" /> <Separator /> <MenuItem Header="_Exit" Command="{Binding ExitCommand}" /> </MenuItem> <MenuItem Header="_Edit"> <MenuItem Header="_Cut" Command="{Binding CutCommand}" /> <MenuItem Header="_Copy" Command="{Binding CopyCommand}" /> <MenuItem Header="_Paste" Command="{Binding PasteCommand}" /> </MenuItem> <MenuItem Header="_Help"> <MenuItem Header="_About" Command="{Binding AboutCommand}" /> </MenuItem> </Menu> ``` 在这个示例中,我们创建了一个菜单栏,其中包含三个菜单项:文件、编辑和帮助。每个菜单项都有一个或多个子菜单项,并且与命令绑定。这是一个简单的例子,你可以根据自己的需求和设计来创建自定义菜单栏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值