WPF中使用WindowChrome自定义窗口中遇到的最大化问题
Posted lonelyxmas
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF中使用WindowChrome自定义窗口中遇到的最大化问题相关的知识,希望对你有一定的参考价值。
原文: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 /// <summary> 2 /// 读取系统主显示器,和窗体可用工作区,获得WPF可用的外边距。 3 /// </summary> 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自定义窗口中遇到的最大化问题的主要内容,如果未能解决你的问题,请参考以下文章
[WPF自定义控件库]使用WindowChrome自定义RibbonWindow
WPF中自定义标题栏时窗体最大化处理之WindowChrome