<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      WPF 使用WindowChrome自定義窗體 保留原生窗體特性

      本文大幅度借鑒dino.c大佬的文章

      http://www.rzrgm.cn/dino623/p/uielements_of_window.html

      http://www.rzrgm.cn/dino623/p/problems_of_WindowChrome.html

      http://www.rzrgm.cn/dino623/p/custom_window_style_using_WindowChrome.html

      我在這里匯總一下,屬于粘了就能用那種。在預設100,125,150,175DPI下最大化也能正常顯示。

      不懂的地方可以閱讀上面的文章

      說到原生窗體的特性都有什么 咱來做個對比 大家來感受下

      使用WindowChrome

      使用WindowStyle="None"

      使用WindowChrome的時候 無需設置就保留了原生陰影、拖拽、交互動畫

      而使用WindowStyle="None"的話,會發現最大化的時候會覆蓋任務欄。

      想要實現原生的樣式就需要自己手寫。

      這些功能可以實現嗎?能實現。效果好嗎? 不一定,像我這種WPF玩的不專業的人很難實現這些功能,啥玩意都得上網扒拉,對不對路還不一定,那百度上一人一種寫法,這就很鬧心。

      <Window x:Class="WpfApp1.MainWindow"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
              mc:Ignorable="d"
              Title="MainWindow" SnapsToDevicePixels="True" StateChanged="Window_StateChanged" Loaded="Window_Loaded">
          <WindowChrome.WindowChrome>
              <WindowChrome UseAeroCaptionButtons="False" NonClientFrameEdges="None" CaptionHeight="40" />
          </WindowChrome.WindowChrome>
          <Grid x:Name="grdMain" Background="Transparent">
              <Grid.RowDefinitions>
                  <RowDefinition Height="40"/>
                  <RowDefinition Height="*"/>
              </Grid.RowDefinitions>
              <Grid Grid.Row="0" Background="#C62F2F">
                  <WrapPanel Orientation="Horizontal" WindowChrome.IsHitTestVisibleInChrome="True" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,0,10,0">
                      <Button x:Name="btnMin" Style="{DynamicResource MinButton}" Click="BtnMin_Click"/>
                      <Button x:Name="btnNorm" Style="{DynamicResource MaxButton}" Margin="3,0,0,0" Click="BtnNorm_Click"/>
                      <Button x:Name="btnClose" Style="{DynamicResource CloseButton}" Margin="3,0,0,0" Click="BtnClose_Click"/>
                  </WrapPanel>
              </Grid>
              <Grid Grid.Row="1" Background="#FFFFFF">
                  <Border BorderThickness="1" BorderBrush="#C62F2F"/>
              </Grid>
          </Grid>
      </Window>

      UseAeroCaptionButtons 表示是對 Windows Aero 標題按鈕啟用的命中測試是否可用,默認值為True。

      NonClientFrameEdges 獲取或設置一個值,該值表示窗口框架邊緣是否歸客戶端所有,默認值為None。

      CaptionHeight 表示窗體菜單欄高度,我這里設置跟Gird里第一行高度一致,代表自定義的菜單欄。

      注意下,我在放置按鈕的WrapPanel容器中設置了 WindowChrome.IsHitTestVisibleInChrome,該值表示 WPF 命中測試在窗口非工作區中的元素是否可用,默認值為False。

      接下來是后臺代碼

      using System;
      using System.Windows;
      using System.Windows.Controls;
      using System.Windows.Input;
      
      namespace WpfApp1
      {
          /// <summary>
          /// MainWindow.xaml 的交互邏輯
          /// </summary>
          public partial class MainWindow : Window
          {
              int paddings = 0;
              public MainWindow()
              {
                  InitializeComponent();
              }
      
              private void Window_Loaded(object sender, RoutedEventArgs e)
              {
                  paddings = 4;
              }
      
              private void Window_StateChanged(object sender, EventArgs e)
              {
                  if (WindowState == WindowState.Maximized)
                  {
                      Thickness thickness = SystemParameters.WindowResizeBorderThickness;
                      grdMain.Margin = new Thickness(thickness.Left + paddings, thickness.Top + paddings, thickness.Right + paddings, thickness.Bottom + paddings);
                  }
                  else
                  {
                      grdMain.Margin = new Thickness(0);
                  }
              }
      
              private void BtnMin_Click(object sender, RoutedEventArgs e)
              {
                  WindowState = WindowState.Minimized;
              }
      
              private void BtnClose_Click(object sender, RoutedEventArgs e)
              {
                  Close();
              }
      
              private void BtnNorm_Click(object sender, RoutedEventArgs e)
              {
                  if (WindowState == WindowState.Normal)
                  {
                      btnNorm.Style = (Style)FindResource("NormButton");
                      WindowState = WindowState.Maximized;
                  }
                  else
                  {
                      btnNorm.Style = (Style)FindResource("MaxButton");
                      WindowState = WindowState.Normal;
                  }
              }
          }
      }

      這里的paddings我默認設置為4,這里需要借鑒下大佬的第一、二篇文章,里面很清晰的解釋道為啥設置為4。

      完整看過第二篇文章的會發現無法直接獲取SM_CXPADDEDBORDER的值。

      我查了官網文檔user32.dll里面有函數可以取值。https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-getsystemmetrics

      [DllImport("user32.dll", CharSet = CharSet.Auto)]
      
      public static extern int GetSystemMetrics(int index);

      只不過按照這個取值來的話125往上的DPI最大化顯示不正常,邊框會比之前厚,咱就默認4就行。

      posted @ 2020-08-31 15:43  o王先生o  閱讀(1192)  評論(1)    收藏  舉報
      主站蜘蛛池模板: 一区二区三区四区黄色网| 精品国精品国自产在国产| 东方四虎av在线观看| 午夜福利看片在线观看| AV人摸人人人澡人人超碰| 国产激情无码一区二区APP| 丰满少妇被猛烈进出69影院| 日韩精品国产二区三区| 欧美丰满熟妇xxxx性ppx人交| 国产人与禽zoz0性伦多活几年| 亚洲美女厕所偷拍美女尿尿| 99国产欧美另类久久久精品| 精品不卡一区二区三区| 欧美牲交a欧美牲交aⅴ一| 深夜国产成人福利在线观看| 免费无码av片在线观看网站| 久久精品国产99久久六动漫| 国产一区二区日韩在线| 国产成人精品无码片区在线观看 | 欧美乱码卡一卡二卡四卡免费| 91产精品无码无套在线| 午夜好爽好舒服免费视频| 精品一区二区三区东京热| 色综合天天综合网天天看片| 人妻少妇偷人一区二区| 91福利视频一区二区| 国产成人久久综合第一区| 亚洲欧美日韩精品久久亚洲区色播| 久久精品国产亚洲AⅤ无码| 亚洲 丝袜 另类 校园 欧美 | 欧美极品色午夜在线视频| 精品国产一区AV天美传媒| 精品国产一区二区在线视| 99久久久无码国产精品免费| 国内自拍第一区二区三区| 福利视频在线一区二区| 国色天香成人一区二区| 国产亚洲欧美日韩俺去了| 久久精品国产亚洲AⅤ无码| 少妇激情a∨一区二区三区| 久久香蕉国产线看观看猫咪av|