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   }

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

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

时间: 2024-10-20 04:29:40

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

ArcGis for Android中如何获取自定义图层中的图片并旋转

============问题描述============ RT,在GraphicsLayer自定义图层中,有一个图片,现在可以获取到手机的旋转角度,然后根据角度去旋转那个图片.现在只能remove掉GraphicsLayer后旋转图片重新添加到map中,这样的话会非常不连贯,达不到百度地图的旋转效果,请教大神们如何解决? ============解决方案1============ BitmapDrawable bd = new BitmapDrawable(context.getResource

PB中外部数据源数据窗口中动态创建列

公司原来做的横向报表用pb的外部数据源的做的,只支持固定列,列数相当于是在数据窗口中固定好的,横向的数据项一多,列就支持不了,需要自己在跑到数据窗口中增加,改程序,于是想列的创建能不能改成动态的呢?通过数据窗口的语法工具,发现有办法: <DW Control Name>.Modify(& "create column( id=<an integer> tabsequence=<an integer> accelerator='<a single

第二十二篇:在SOUI中使用代码向窗口中插入子窗口

使用SOUI开发客户端UI程序,通常也推荐使用XML代码来创建窗口,这样创建的窗口使用方便,当窗口大小改变时,内部的子窗口也更容易协同变化. 但是最近不断有网友咨询如何使用代码来创建SOUI子窗口,特此在这里统一解答. 要回答这个问题,首先要了解SOUI窗口创建及布局的流程. 先从swnd.cpp里抄一段创建子窗口的代码: 1 BOOL SWindow::CreateChildren(pugi::xml_node xmlNode) 2 { 3 TestMainThread(); 4 for (p

dede中sql调用自定义字段中的图片

[field:id runphp='yes']$aid = @me;$row = $GLOBALS['dsql']->GetOne("Select tu2 From `#@__addonarticle` where aid='$aid' ");@me = "{$row['tu2']}";[/field:id] `#@__addonarticle` 这个地方不是单引号 自定义字段 选择 图片 仅地址

WPF编程,使用WindowChrome实现自定义窗口功能的一种方法。

原文:WPF编程,使用WindowChrome实现自定义窗口功能的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/88064191 效果: 1.安装:下载地址可网上找,也可从最后的地址 2.增加引用 3.增加命名空间 ? ? ? ? xmlns:shell="clr-namespace:Microsoft.Windows.Shell;assembly=Microsoft.Windows.

如何监视 WPF 中的所有窗口,在所有窗口中订阅事件或者附加 UI

原文:如何监视 WPF 中的所有窗口,在所有窗口中订阅事件或者附加 UI 由于 WPF 路由事件(主要是隧道和冒泡)的存在,我们很容易能够通过只监听窗口中的某些事件使得整个窗口中所有控件发生的事件都被监听到.然而,如果我们希望监听的是整个应用程序中所有的事件呢?路由事件的路由可并不会跨越窗口边界呀? 本文将介绍我编写的应用程序窗口监视器,来监听整个应用程序中所有窗口中的路由事件.这样的方法可以用来无时无刻监视 WPF 程序的各种状态. 其实问题依旧摆在那里,因为我们依然无法让路由事件跨越窗口边界

QT5中如何自定义窗口部件

提升法 eg.(定义一个新的QLable部件)1.定义一个类class Label : public base, public QLabel //可以支持多重继承2.在qt creator中打开ui编辑器,拖曳一个QLable兑现,提升,输入提升的类名Label,勾选全部包含,添加,提升成功. 插件法Qt Assistance:Creating Custom Widgets for Qt Designer1.和提升法一样,也需要先建立一个新的部件类class AnalogClock : publ

WPF 自定义窗口

在WPF中我们经常需要抛去windows自带的窗口的样式,设定一些自定义样式的窗口,这个时候我们需要设定 WindowStyle="None" 来移除windows自带的界面样式.除此之外我们还需要设定 AllowsTransparency ="True" 来让窗口支持透明的效果. 这里分享一个 自定义窗口的demo,该demo实现的基本功能有: 实现自定义窗口的最小化.最大化.还原.关闭功能,默认为最大化: 最小化.最大化.还原.关闭按钮在捕获鼠标之后会有动画改变

[WPF自定义控件库]使用WindowChrome自定义RibbonWindow

原文:[WPF自定义控件库]使用WindowChrome自定义RibbonWindow 1. 为什么要自定义RibbonWindow 自定义Window有可能是设计或功能上的要求,可以是非必要的,而自定义RibbonWindow则不一样: 如果程序使用了自定义样式的Window,为了统一外观需要把RibbonWindow一起修改样式. 为了解决RibbonWindow的BUG. 如上图所示,在Windows 10 上运行打开RibbonWindow,可以看到标题栏的内容(包括分隔符)没有居中对齐