WPF WindowChrome 自定义窗口

1.wpf自定义窗口:

WindowChrome类描述:https://msdn.microsoft.com/zh-cn/library/system.windows.shell.windowchrome.aspx

示例样式效果:

1.设置GlassFrameThickness=0 隐藏默认标题栏

  

2.最大化最小化不会盖住任务栏

不能设置WindowStyle="None",否则靠WindowState属性最大化时会出现窗体显示在任务栏背后,导致部分窗体被遮盖

3关于屏幕溢出问题

没google到很好的办法,目前是添加margin解决,就是最大化时添加8px margin,这个值是google到的帖子中代码中出现频率较高的值,也有人推荐这个值,但是无法兼容屏幕分辨率,可以大体根据屏幕分辨率设置不同的值.

然后,我尝试过将CaptionHeight=0,然后不依赖WindowState属性而是手动去设置Location, width ,height,

过程中遇到一个问题:CaptionHeight设置为0,但是Caption区域任然存在,但是和设置了CaptionHeight时有区别,这个区域(长、宽)不随窗体最大化而变化,也就是最大化了Caption的宽度不变,导致左边区域可以拖动窗体,右边区域无法拖动。

所以解决最大化、最小化、最大化时拖动标题栏变成Normal状态、拉动窗体四边框调整窗体大小、解决屏幕溢出、解决任务栏覆盖的问题最好的办法就是不用WindowChrome,但是又会遇到 AllowsTransparency="True"的问题

 <Border>
        <Border.Style>
            <Style TargetType="{x:Type Border}">
                <Style.Triggers>
                    <!-- fix window screen overflow,set margin 8px -->
                    <DataTrigger Binding="{Binding WindowState, RelativeSource={RelativeSource AncestorType=Window}}" 
                                 Value="Maximized">
                        <Setter Property="Margin" Value="8px"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding WindowState, RelativeSource={RelativeSource AncestorType=Window}}" 
                                 Value="Normal">
                        <Setter Property="Margin" Value="0"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Border.Style>
<Border>    window content ...... </Border>
 </Border>
<Window x:Class="WindowChromeTest.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:shell="clr-namespace:Microsoft.Windows.Shell;assembly=Microsoft.Windows.Shell"
        xmlns:local="clr-namespace:WindowChromeTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style TargetType="local:MainWindow">
            <Setter Property="shell:WindowChrome.WindowChrome">
                <Setter.Value>
                    <shell:WindowChrome
                        CaptionHeight="50"
                        GlassFrameThickness="0"
                        CornerRadius="0"
                        ResizeBorderThickness="2"
                        ></shell:WindowChrome>
                </Setter.Value>
            </Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type local:MainWindow}">
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="50"></RowDefinition>
                                <RowDefinition Height="*"></RowDefinition>
                            </Grid.RowDefinitions>
                            <Border Grid.Row="0" Background="Orange">
                                <StackPanel Orientation="Horizontal">
                                    <Button shell:WindowChrome.IsHitTestVisibleInChrome="True" Content="Test Button" Click="Button_Click"></Button>
                                </StackPanel>
                            </Border>
                            <Border Grid.Row="1" Background="White">
                                <ContentPresenter Content="{TemplateBinding Content}"></ContentPresenter>
                            </Border>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <TextBlock Text="asdasdf"></TextBlock>
</Window>

  

原文地址:https://www.cnblogs.com/maoyuanwai/p/7089889.html