WPF中使用WindowChrome自定义窗口中遇到的最大化问题

2021-06-21 13:05

阅读:516

标签:throw   option   ado   blog   margin   template   asp   显示   navig   

原文:WPF中使用WindowChrome自定义窗口中遇到的最大化问题

FrameWork 4.5 之后,内置了WindowChrome类,官方文档:

https://msdn.microsoft.com/en-us/library/system.windows.shell.windowchrome.aspx

如果你是旧版本,可以去搜索单独的dll。

上方的页面,解释和例子也都是旧版本的,如果新版本,比如和我一样,是4.6.2,可以继续往下看新的用法,相比文档中的旧方式,新的用法的确更简单有效了。

问题:shell:SystemParameters2.Current 在新的版本中不知道在哪里找。

回答:

xmlns:shell="clr-namespace:System.Windows.Shell;assembly=PresentationFramework"

shell:SystemParameters2 已经移除,相关的类似操作,可以在shell:SystemParameters中找到。

以下是Window的样式:无标题栏,无图标,无功能按钮,当然也没拖动。

 1   Style x:Key="ShellNoneStyleWindow"
 2          TargetType="Window">
 3     Setter Property="AllowsTransparency" Value="True" />
 4     Setter Property="WindowStyle" Value="None" />
 5     Setter Property="Background" Value="Transparent" />
 6     Setter Property="ResizeMode" Value="NoResize" />
 7     Setter Property="TextOptions.TextFormattingMode" Value="Display" />
 8     Setter Property="shell:WindowChrome.WindowChrome">
 9       Setter.Value>
10         shell:WindowChrome CaptionHeight="0"
11                             GlassFrameThickness="0"
12                             NonClientFrameEdges="None"
13                             ResizeBorderThickness="0"
14                             UseAeroCaptionButtons="False" />
15       Setter.Value>
16     Setter>
17     Setter Property="Template">
18       Setter.Value>
19         ControlTemplate TargetType="Window">
20           AdornerDecorator Grid.Row="1"
21                             KeyboardNavigation.IsTabStop="False">
22             Border x:Name="Content_Panel">
23               ContentPresenter x:Name="MainContentPresenter"
24                                 KeyboardNavigation.TabNavigation="Cycle" />
25             Border>
26           AdornerDecorator>
27           ControlTemplate.Triggers>
28             Trigger Property="WindowState" Value="Maximized">
29               Setter TargetName="Content_Panel" Property="Margin">
30                 Setter.Value>
31                   Binding>
32                     Binding.Converter>
33                       cvt:SystemWorkAreaToMarginConverter />
34                     Binding.Converter>
35                   Binding>
36                 Setter.Value>
37               Setter>
38             Trigger>
39           ControlTemplate.Triggers>
40         ControlTemplate>
41       Setter.Value>
42     Setter>
43   Style>

 以下是关键的 cvt:SystemWorkAreaToMarginConverter

 1   /// 
 2   /// 读取系统主显示器,和窗体可用工作区,获得WPF可用的外边距。
 3   /// 
 4   public class SystemWorkAreaToMarginConverter : IValueConverter
 5   {
 6     public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
 7     {
 8       return new Thickness(
 9           SystemParameters.WorkArea.Left
10         , SystemParameters.WorkArea.Top
11         , SystemParameters.PrimaryScreenWidth - SystemParameters.WorkArea.Width
12         , SystemParameters.PrimaryScreenHeight - SystemParameters.WorkArea.Height
13         );
14     }
15 
16     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
17     {
18       throw new NotImplementedException();
19     }
20   }

思路就是整个屏幕裁掉任务栏部分,可供“最大化窗体”使用的部分了,所得到的外边距便是任务栏的那部分区域。

 

WPF中使用WindowChrome自定义窗口中遇到的最大化问题

标签:throw   option   ado   blog   margin   template   asp   显示   navig   

原文地址:https://www.cnblogs.com/lonelyxmas/p/10236584.html


评论


亲,登录后才可以留言!