WPF中使用WindowChrome自定義窗口中遇到的最大化問題

FrameWork 4.5 以後,內置了WindowChrome類,官方文檔:chrome

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

若是你是舊版本,能夠去搜索單獨的dll。windows

上方的頁面,解釋和例子也都是舊版本的,若是新版本,好比和我同樣,是4.6.2,能夠繼續往下看新的用法,相比文檔中的舊方式,新的用法的確更簡單有效了。spa

問題:shell:SystemParameters2.Current 在新的版本中不知道在哪裏找。code

回答:orm

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

shell:SystemParameters2 已經移除,相關的相似操做,能夠在shell:SystemParameters中找到。blog

如下是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:SystemWorkAreaToMarginConverterget

 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   }

思路就是整個屏幕裁掉任務欄部分,可供「最大化窗體」使用的部分了,所獲得的外邊距即是任務欄的那部分區域。

相關文章
相關標籤/搜索