zoukankan      html  css  js  c++  java
  • 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   }

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

  • 相关阅读:
    app启动优化
    CountDownLatch妙用
    匿名内部类为什么有可能造成内存泄漏
    单例模式为什么有可能造成内存泄漏
    左移右移记不住怎么办
    说一说ThreadLocal
    对framework层的一些看法
    双重锁单例
    JMM总结
    关于lock前缀
  • 原文地址:https://www.cnblogs.com/3Tai/p/9209988.html
Copyright © 2011-2022 走看看