精华内容
下载资源
问答
  • WinForm实现两个窗体应用程序的消息传递 WinForm窗体实现事件的定义、触发与处理WPF实现两个窗体应用程序的消息传递 WPF窗体实现事件的定义、触发与处理
  • WPF窗体

    2019-07-24 09:37:00
    效果: 1. 点击WPF窗体上的一个按钮,...1. 在WPF项目中,已有主窗体MainWindow,再新建子窗体ChildWindow: 2. 在主窗体的按钮单击事件的处理程序中: 1 private void Button2_Click(object sender, Rou...

     

    效果:

    1. 点击WPF主窗体上的一个按钮,弹出子窗体,

    2. 窗体最小化后,在菜单栏中点击子窗体,会连带显示它所从属的主窗体。

     

    1. 在WPF项目中,已有主窗体MainWindow,再新建子窗体ChildWindow:

       

    2. 在主窗体的按钮单击事件的处理程序中:

     1 private void Button2_Click(object sender, RoutedEventArgs e)
     2 {
     3     var childWindow = new ChildWindow();
     4 
     5     //写法一:代码就写在MainWindow的后台代码中时写this即是MainWindow
     6     //_childWindow.Owner = this;
     7 
     8     //写法二:代码写在其他地方时,写清楚当前应用程序的MainWindow
     9     childWindow.Owner = Application.Current.MainWindow;
    10 
    11
    //childWindow.Show(); 12 childWindow.ShowDialog(); 13 }

     

    【显示窗口】

    为显示窗口,需要创建Window类的实例并使用Show()或ShowDialog()方法。

    其中Show()方法显示非模态窗口,不会阻止用户访问其他任何窗口;

    ShowDialog()方法显示模态窗口,会锁定所有鼠标和键盘输入来阻止用户访问父窗口,知道模态窗口关闭。

     

    【从属父窗口】

    设置子窗口的Owner为父窗口,则,当单独选择子窗体时,会附带弹出父窗口。

     

    转载于:https://www.cnblogs.com/zwh1993/p/11235892.html

    展开全文
  • WPF窗体应用程序开发

    2019-07-03 17:04:00
    1、Window:登录窗口、主窗体、消息框 2、UserControl:业务界面、消息框(如果使用UC来实现,则需要做特殊的处理,比如中断功能如何处理?)(显示一个UC,必须将其添加到容器中,所以<第一层UC的显示>只能...

    1、Window:登录窗口、主窗体、消息框

    2、UserControl:业务界面、消息框(如果使用UC来实现,则需要做特殊的处理,比如中断功能如何处理?)(显示一个UC,必须将其添加到容器中,所以<第一层UC的显示>只能依靠Window提供的容器)

    3、建议将大布局中使用面板控制的  “各个功能区域”  ==>  抽取成独立的UC来处理

     

    转载于:https://www.cnblogs.com/changbaishan/p/11127598.html

    展开全文
  • 主要给大家介绍了关于WPF窗体最大化问题的解决方法,文中通过示例代码介绍的非常详细,对大家学习或者使用wpf具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • WPF窗体 WPF窗体调用函数

    千次阅读 2015-07-28 15:19:48
    转载地址:...原文地址:待添加··· WPF窗体  一、窗体类 在Visual Studio和Expression Blend中,自定义的窗体均继承System.Windows.Window类(类型化窗体)。定义的窗体由两部分组成: 1

    转载地址:http://www.360doc.com/content/12/0307/20/8463843_192559772.shtml

    原文地址:待添加···

    WPF窗体   

    一、窗体类

    在Visual Studio和Expression Blend中,自定义的窗体均继承System.Windows.Window类(类型化窗体)。定义的窗体由两部分组成:

    1、XAML文件

       1: <Window
       2:     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       3:     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       4:     x:Class="WpfWindow.BasicWindow"
       5:     x:Name="Window"
       6:     Title="BasicWindow"
       7:     Width="300" Height="200">
       8:     <Canvas>
       9:         <Button x:Name="btnMessage" Width="79" Height="24" Content="OK" 
      10:         Canvas.Left="172" Canvas.Top="93" Click="btnMessage_Click"/>
      11:         <TextBox x:Name="txtValue" Width="215" Height="25" 
      12:         Canvas.Left="36" Canvas.Top="48" Text="" TextWrapping="Wrap"/>
      13:     </Canvas>
      14: </Window>

    2、后台代码文件

       1: using System;
       2: using System.Windows;
       3:  
       4: namespace WpfWindow
       5: {
       6:     public partial class BasicWindow : Window
       7:     {
       8:         public BasicWindow()
       9:         {
      10:             this.InitializeComponent();
      11:         }
      12:  
      13:         private void btnMessage_Click(object sender, System.Windows.RoutedEventArgs e)
      14:         {
      15:             txtValue.Text = "Hello World";
      16:         }
      17:     }
      18: }

    也可以将后台代码放在XAML文件中,上面的例子可以改写为:

       1: <Window
       2:     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       3:     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       4:     x:Class="WpfWindow.BasicWindow"
       5:     x:Name="Window"
       6:     Title="BasicWindow"
       7:     Width="300" Height="200">
       8:     <Canvas>
       9:         <Button x:Name="btnMessage" Width="79" Height="24" Content="OK" 
      10:         Canvas.Left="172" Canvas.Top="93" Click="btnMessage_Click"/>
      11:         <x:Code><![CDATA[
      12:             void btnMessage_Click(object sender, System.Windows.RoutedEventArgs e)
      13:             {
      14:                 txtValue.Text = "Hello World";
      15:             }
      16:         ]]>
      17:         </x:Code>
      18:         <TextBox x:Name="txtValue" Width="215" Height="25" 
      19:         Canvas.Left="36" Canvas.Top="48" Text="" TextWrapping="Wrap"/>
      20:     </Canvas>
      21: </Window>

    二、窗体的生存周期

    1、显示窗体

    • 构造方法
    • Show()、ShowDialog()方法:Show()方法显示非模态窗口,ShowDialog()方法显示模态窗口
    • Loaded事件:窗体第一次Show()或ShowDialog()时引发的事件,通常在此事件中加载窗体的初始化数据

    2、关闭窗体

    • Close()方法:关闭窗体,并释放窗体的资源
    • Closing事件、Closed事件:关闭时、关闭后引发的事件,通常在Closing事件中提示用户是否退出。

    3、窗体的激活

    • Activate()方法:激活某窗体
    • Activated、Deactivated事件:当窗体激动、失去焦点时引发的事件

    4、窗体的生存周期

    5.WPF窗体  - 雅博 - 雅博

    示例程序:

    • 在窗体载入时显示当前日期,并开始播放媒体
    • 当窗体失去焦点时暂停播放媒体
    • 当窗体重新获得焦点时继承播放窗体
    • 当点击窗体的关闭按钮时,询问用户是否退出应用程序

    XAML文件:

       1: <Window x:Class="WpfWindow.WindowLifeCycle"
       2:     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       3:     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       4:     Title="WindowLifeCycle" Height="200" Width="300" 
       5:         Loaded="Window_Loaded" 
       6:         Activated="Window_Activated" 
       7:         Deactivated="Window_Deactivated" 
       8:         Closing="Window_Closing">
       9:     <Canvas>
      10:         <TextBlock Canvas.Right="15" Canvas.Bottom="15" Height="21" Name="txtDate"/>
      11:         <MediaElement Canvas.Left="89" Canvas.Top="12" Height="100" Width="100" 
      12:                       Name="myMedia" Source="numbers.wmv" 
      13:                       Stretch="Fill" LoadedBehavior="Manual" />
      14:     </Canvas>
      15: </Window>

    代码文件:

       1: using System;
       2: using System.Windows;
       3:  
       4: namespace WpfWindow
       5: {
       6:     public partial class WindowLifeCycle : Window
       7:     {
       8:         public WindowLifeCycle()
       9:         {
      10:             InitializeComponent();
      11:         }
      12:  
      13:         // 开关变量,判断是否正在播放媒体
      14:         private bool isPlaying;
      15:  
      16:         private void Window_Loaded(object sender, RoutedEventArgs e)
      17:         {
      18:             // 窗体加载时,显示当前日期及开始播放媒体
      19:             txtDate.Text = DateTime.Now.ToString("yyyy-MM-dd");
      20:  
      21:             myMedia.Play();
      22:             isPlaying = true;
      23:         }
      24:  
      25:         private void Window_Activated(object sender, EventArgs e)
      26:         {
      27:             // 如果窗体被激活,则继承播放媒体
      28:             if (!isPlaying)
      29:             {
      30:                 myMedia.Play();
      31:                 isPlaying = true;
      32:             }
      33:         }
      34:  
      35:         private void Window_Deactivated(object sender, EventArgs e)
      36:         {
      37:             // 如果窗体失去焦点,则暂停播放媒体
      38:             if (isPlaying)
      39:             {
      40:                 myMedia.Pause();
      41:                 isPlaying = false;
      42:             }
      43:         }
      44:  
      45:         private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
      46:         {
      47:             // 点击窗体的“关闭”按钮,询问用户是否退出程序
      48:  
      49:             string message = "Quit the application?";
      50:             string title = "System Information";
      51:             MessageBoxButton button = MessageBoxButton.OKCancel;
      52:             MessageBoxImage img = MessageBoxImage.Question;
      53:  
      54:             MessageBoxResult result = MessageBox.Show(
      55:                 message, title, button, img);
      56:  
      57:             if (result == MessageBoxResult.Cancel)
      58:             {
      59:                 e.Cancel = true;    // 取消退出
      60:             }
      61:         }
      62:     }
      63: }

    三、其他窗体相关的属性、方法、事件

    WPF窗体的详细的属性、方法、事件请参考MSDN,有很多的属性、方法、事件与Windows应用程序中System.Windows.Forms.Form类相同或近似,其中常用的一些属性、方法、事件有:

    • 窗体边框模式(WindowStyle属性)和是否允许更改窗体大小(ResizeMode属性)
    • 窗体启动位置(WindowStartupLocation属性)和启动状态(WindowState属性)
    • 窗体标题(Title属性)
    • 始终在最前(TopMost属性)
    • 是否显示在任务栏(ShowInTaskbar)

    四、定义异形窗体

    使用异形窗体,可以将窗体的背景设置为透明,边框设置为空,然后利用控件做出异形的窗体,例如:

    XAML:

       1: <Window x:Class="WpfWindow.CustomerWindow"
       2:     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       3:     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       4:     Title="NonRectangularWindowSample" SizeToContent="WidthAndHeight" 
       5:     MouseLeftButtonDown="NonRectangularWindow_MouseLeftButtonDown"
       6:     WindowStyle="None" 
       7:     AllowsTransparency="True" 
       8:     Background="Transparent">
       9:     <Canvas Width="200" Height="200" >
      10:         <Path Stroke="DarkGray" StrokeThickness="2">
      11:             <Path.Fill>
      12:                 <LinearGradientBrush StartPoint="0.2,0" EndPoint="0.8,1" >
      13:                     <GradientStop Color="White"  Offset="0"></GradientStop>
      14:                     <GradientStop Color="White"  Offset="0.45"></GradientStop>
      15:                     <GradientStop Color="LightBlue" Offset="0.9"></GradientStop>
      16:                     <GradientStop Color="Gray" Offset="1"></GradientStop>
      17:                 </LinearGradientBrush>
      18:             </Path.Fill>
      19:             <Path.Data>
      20:                 <PathGeometry>
      21:                     <PathFigure StartPoint="40,20" IsClosed="True">
      22:                         <LineSegment Point="160,20"></LineSegment>
      23:                         <ArcSegment Point="180,40" Size="20,20" SweepDirection="Clockwise"></ArcSegment>
      24:                         <LineSegment Point="180,80"></LineSegment>
      25:                         <ArcSegment Point="160,100" Size="20,20" SweepDirection="Clockwise"></ArcSegment>
      26:                         <LineSegment Point="90,100"></LineSegment>
      27:                         <LineSegment Point="90,150"></LineSegment>
      28:                         <LineSegment Point="60,100"></LineSegment>
      29:                         <LineSegment Point="40,100"></LineSegment>
      30:                         <ArcSegment Point="20,80" Size="20,20" SweepDirection="Clockwise"></ArcSegment>
      31:                         <LineSegment Point="20,40"></LineSegment>
      32:                         <ArcSegment Point="40,20" Size="20,20" SweepDirection="Clockwise"></ArcSegment>
      33:                     </PathFigure>
      34:                 </PathGeometry>
      35:             </Path.Data>
      36:         </Path>
      37:         <Label Width="200" Height="120" FontSize="15" HorizontalContentAlignment="Center" VerticalContentAlignment="Center">Drag Me</Label>
      38:         <Button Canvas.Left="155" Canvas.Top="30" Click="closeButtonRectangle_Click">
      39:             <Button.Template>
      40:                 <ControlTemplate>
      41:                     <Canvas>
      42:                         <Rectangle Width="15" Height="15" Stroke="Black" RadiusX="3" RadiusY="3">
      43:                             <Rectangle.Fill>
      44:                                 <SolidColorBrush x:Name="myAnimatedBrush" Color="Red" />
      45:                             </Rectangle.Fill>
      46:                         </Rectangle>
      47:                         <Line X1="3" Y1="3" X2="12" Y2="12" Stroke="White" StrokeThickness="2"></Line>
      48:                         <Line X1="12" Y1="3" X2="3" Y2="12" Stroke="White" StrokeThickness="2"></Line>
      49:                     </Canvas>
      50:                 </ControlTemplate>
      51:             </Button.Template>
      52:         </Button>
      53:     </Canvas>
      54: </Window>

    代码文件:

       1: using System.Windows;
       2: using System.Windows.Input;
       3:  
       4: namespace WpfWindow
       5: {
       6:     public partial class CustomerWindow : Window
       7:     {
       8:         public CustomerWindow()
       9:         {
      10:             InitializeComponent();
      11:         }
      12:  
      13:         void NonRectangularWindow_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
      14:         {
      15:             this.DragMove();
      16:         }
      17:  
      18:         void closeButtonRectangle_Click(object sender, RoutedEventArgs e)
      19:         {
      20:             this.Close();
      21:         }
      22:     }
      23: }

     5.WPF窗体  - 雅博 - 雅博


    另:

    Window 有几个重要的事件:他们调用的顺序是: 

    Window.Initialized 

    Window.Activatied (object sender, EventArgs e)

    Window.Loaded (object sender, RoutedEventArgs e)

    Window.ContentRendered 

    Window.DeActivatied 

    Window.Closing 

    Window.UnLoad 

    Window.Closed 

    Window.Activatied

    可能会与Window.DeActivatied 切换多次(窗体切换的时候发生)

    展开全文
  • Wpf 自定义窗体

    2019-09-30 10:41:33
    Wpf做客户端界面也有一段时间了,一直都直接使用的Window显示窗体,这几天闲来没事情,整理了下,自己做了一个自定义窗体。我自定义的窗体需要达到的细节效果包括: 1、自定义边框粗细、颜色,窗体顶端不要有边框...

          用Wpf做客户端界面也有一段时间了,一直都直接使用的Window显示窗体,这几天闲来没事情,整理了下,自己做了一个自定义窗体。我自定义的窗体需要达到的细节效果包括:

          1、自定义边框粗细、颜色,窗体顶端不要有边框线,也就是说只有窗体左、右和底有边框,顶部是标题栏;

          2、实现圆角窗体,当具有圆角时,关闭按钮离窗体右侧边距为圆角值;

          3、标题栏有logo图标和标题栏文字,右侧有最小化、最大化和关闭按钮,需使用fontawesome字体图标,最大化按钮有切换图标效果;

          4、窗体最大化后不遮挡系统任务栏;

          网上度娘的文章基本都只针对某一个方面来说,我总结下做为我学习研究的一个小结,最终实现的效果如下图所示:

    1

          资源字典

          我们先来看一下窗体的自定义资源xaml文件的代码,注意我是使用“自定义控件”创建这个自定义窗体,如下图所示,而不是“用户控件”,2者之间的差异是,“自定义控件”将xaml和cs代码分离,xaml文件名称为Generic.xaml,该文件被自动存放在一个叫做”Themes”的文件夹中,如下面第2张图所示。而通过“用户控件”选项创建的控件xaml和cs代码是归并在一起的,cs是后台代码。

    1 2

          Generic.xaml代码

          代码首先通过xmlns:local="clr-namespace:youplus.OA.WpfApp"引入名称空间,该空间下我们定义了WindowBase.cs的代码;通过xmlns:converter="clr-namespace:youplus.OA.WpfApp.Converter"引入值转换器。

    然后定义了3个值转换器用于转换边框粗细、圆角半径、关闭按钮右侧边距的值。然后引入了FontAwesome字体,最小化、最大化、关闭按钮是使用的该字体里的对应项。然后定义了这几个按钮所使用的样式。最后是WindowBase窗体的自定义模板。

    <ResourceDictionary
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:youplus.OA.WpfApp"
        xmlns:converter="clr-namespace:youplus.OA.WpfApp.Converter">
        
        <converter:WindowBaseBorderThicknessConverter x:Key="BorderThicknessConverter"/>
        <converter:WindowBaseCornerRadiusConverter x:Key="CornerRadiusConverter"/>
        <converter:WindowBaseCloseMarginRightConverter x:Key="CloseMarginRightConverter"/>    
        
        <Style x:Key="FontAwesome" >
            <Setter Property="TextElement.FontFamily" Value="pack://application:,,,/Resources/#FontAwesome" />
            <Setter Property="TextElement.FontSize" Value="11" />
        </Style>
        
        <Style x:Key="WindowBaseButton" TargetType="{x:Type Button}">
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="Foreground" Value="Black"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Border BorderThickness="{TemplateBinding BorderThickness}"
                                Background="{TemplateBinding Background}"
                                >
                            <ContentPresenter HorizontalAlignment="Center"
                                              VerticalAlignment="Center"
                                              Margin="{TemplateBinding Padding}"
                                               />
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter Property="Background" Value="#c75050"/>
                                <Setter Property="Foreground" Value="White"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style> 
        
        <Style TargetType="{x:Type local:WindowBase}">
            <Setter Property="AllowsTransparency" Value="True" />
            <Setter Property="WindowStyle" Value="None"/>
            <Setter Property="ResizeMode" Value="CanMinimize"/>
            <Setter Property="BorderBrush" Value="#6fbdd1" />
            <Setter Property="CornerRadius" Value="2" />
            <Setter Property="BorderThickness" Value="4"/>
            <Setter Property="Background" Value="White"/>
            <Setter Property="HeaderHeight" Value="40"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type local:WindowBase}">                   
                        <Grid Name="root" Style="{StaticResource FontAwesome}">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="{Binding RelativeSource={RelativeSource TemplatedParent},Path=HeaderHeight}"/>
                                <RowDefinition/>
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition/>
                            </Grid.ColumnDefinitions>
                            <Border Name="header" Background="{TemplateBinding BorderBrush}"
                                    CornerRadius="{Binding Path=CornerRadius, RelativeSource={RelativeSource TemplatedParent},
                                        Converter={StaticResource CornerRadiusConverter}, ConverterParameter=header}"
                                    BorderThickness="0">
                                <DockPanel Height="Auto">
                                    <StackPanel VerticalAlignment="Center" Orientation="Horizontal" DockPanel.Dock="Left">
                                        <Image Source="{TemplateBinding Icon}" MaxHeight="20" MaxWidth="20" Margin="10,0,0,0"/>
                                        <TextBlock Text="{TemplateBinding Title}" FontSize="14" FontFamily="Microsoft Yihi" VerticalAlignment="Center" Margin="6,0,0,0"></TextBlock>
                                    </StackPanel>
                                    <StackPanel DockPanel.Dock="Right" Height="32" HorizontalAlignment="Right" VerticalAlignment="Top" Orientation="Horizontal">
                                        <Button x:Name="btnMin" Width="32" Content="&#xf2d1;" Style="{StaticResource WindowBaseButton}" Padding="0,0,0,7"/>
                                        <Button x:Name="btnMax" Width="32" Content="&#xf2d0;" Style="{StaticResource WindowBaseButton}"/>
                                        <Button Content="&#xf00d;" x:Name="btnClose" Width="32" 
                                                Margin="{Binding Path=CornerRadius,RelativeSource={RelativeSource TemplatedParent},
                                                    Converter={StaticResource CloseMarginRightConverter}}"
                                                 Style="{StaticResource WindowBaseButton}"/>
                                    </StackPanel>
                                </DockPanel>
                            </Border>
                            <Border Grid.Row="1" CornerRadius="{Binding Path=CornerRadius,RelativeSource={RelativeSource TemplatedParent},
                                        Converter={StaticResource CornerRadiusConverter}, ConverterParameter=content}"
                                    BorderThickness="{TemplateBinding BorderThickness,Converter={StaticResource BorderThicknessConverter}}"
                                    BorderBrush="{TemplateBinding BorderBrush}"
                                    Background="{TemplateBinding Background}"
                                    DockPanel.Dock="Top" Height="Auto">
                                <AdornerDecorator>
                                    <ContentPresenter />
                                </AdornerDecorator>
                            </Border>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>

    WindowBase.cs

    接下来我们看看WindowBase的代码,它继承自Window,自定义了HeaderHeight和CornerRadius两个依赖项属性,从而可以在以上的xaml代码中配置2个属性。在静态WindowBase构造函数中我们要完成依赖项属性的注册,在实例WindowBase构造函数中我们监听SystemParameters.StaticPropertyChanged事件,从而可以使窗体最大化时不覆盖系统任务栏。最后通过覆盖父类的OnApplyTemplate事件代码,来为几个按钮配置状态和事件。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace youplus.OA.WpfApp
    {
        public class WindowBase : Window
        {
            private static DependencyProperty HeaderHeightProperty;
            public int HeaderHeight
            {
                get => (int)GetValue(HeaderHeightProperty);
                set => SetValue(HeaderHeightProperty, value);
            }
    
            private static int maxCornerRadius = 10;
            public static DependencyProperty CornerRadiusProperty;
            public int CornerRadius
            {
                get => (int)GetValue(CornerRadiusProperty);
                set => SetValue(CornerRadiusProperty, value);
            }
    
            static WindowBase()
            {
                DefaultStyleKeyProperty.OverrideMetadata(typeof(WindowBase), new FrameworkPropertyMetadata(typeof(WindowBase)));
    
                FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata();
                metadata.Inherits = true;
                metadata.DefaultValue = 2;
                metadata.AffectsMeasure = true;
                metadata.PropertyChangedCallback += (d,e)=> { };
                CornerRadiusProperty = DependencyProperty.Register("CornerRadius",
                    typeof(int), typeof(WindowBase), metadata,
                    o => {
                        int radius = (int)o;
                        if (radius >= 0 && radius <= maxCornerRadius) return true;
                        return false;
                    });
    
                metadata = new FrameworkPropertyMetadata();
                metadata.Inherits = true;
                metadata.DefaultValue = 40;
                metadata.AffectsMeasure = true;
                metadata.PropertyChangedCallback += (d, e) => { };
                HeaderHeightProperty = DependencyProperty.Register("HeaderHeight",
                    typeof(int), typeof(WindowBase), metadata,
                    o => {
                        int radius = (int)o;
                        if (radius >= 0 && radius <= 1000) return true;
                        return false;
                    });
            }
    
            public WindowBase() : base()
            {
                SystemParameters.StaticPropertyChanged -= SystemParameters_StaticPropertyChanged;
                SystemParameters.StaticPropertyChanged += SystemParameters_StaticPropertyChanged;
            }
    
            private void SystemParameters_StaticPropertyChanged(object sender, PropertyChangedEventArgs e)
            {
                if (e.PropertyName == "WorkArea")
                {
                    if (this.WindowState == WindowState.Maximized)
                    {
                        double top = SystemParameters.WorkArea.Top;
                        double left = SystemParameters.WorkArea.Left;
                        double right = SystemParameters.PrimaryScreenWidth - SystemParameters.WorkArea.Right;
                        double bottom = SystemParameters.PrimaryScreenHeight - SystemParameters.WorkArea.Bottom;
                        root.Margin = new Thickness(left, top, right, bottom);
                    }
                }
            }
    
            private double normaltop;
            private double normalleft;
            private double normalwidth;
            private double normalheight;
            private Grid root;
            private Button minBtn;
            private Button maxBtn;
            private Button closeBtn;
            private Border header;
    
            public override void OnApplyTemplate()
            {
                base.OnApplyTemplate();
    
                minBtn = (Button)Template.FindName("btnMin", this);
                minBtn.Click += (o, e) => WindowState = WindowState.Minimized;
    
                maxBtn = (Button)Template.FindName("btnMax", this);
                root = (Grid)Template.FindName("root",this);
                maxBtn.Click += (o, e) =>
                {
                    if (WindowState == WindowState.Normal)
                    {
                        normaltop = this.Top;
                        normalleft = this.Left;
                        normalwidth = this.Width;
                        normalheight = this.Height;
    
                        double top = SystemParameters.WorkArea.Top;
                        double left = SystemParameters.WorkArea.Left;
                        double right = SystemParameters.PrimaryScreenWidth - SystemParameters.WorkArea.Right;
                        double bottom = SystemParameters.PrimaryScreenHeight - SystemParameters.WorkArea.Bottom;
                        root.Margin = new Thickness(left, top, right, bottom);
    
                        WindowState = WindowState.Maximized;
                        maxBtn.Content = "\xf2d2";
                    }
                    else
                    {
                        WindowState = WindowState.Normal;
                        maxBtn.Content = "\xf2d0";
    
                        Top = 0;
                        Left = 0;
                        Width = 0;
                        Height = 0;
    
                        this.Top = normaltop;
                        this.Left = normalleft;
                        this.Width = normalwidth;
                        this.Height = normalheight;
    
                        root.Margin = new Thickness(0);
                    }
                };
    
                closeBtn = (Button)Template.FindName("btnClose", this);
                closeBtn.Click += (o, e) => Close();
    
                header = (Border)Template.FindName("header", this);
                header.MouseMove += (o, e) =>
                {
                    if (e.LeftButton == MouseButtonState.Pressed)
                    {
                        this.DragMove();
                    }
                };
                header.MouseLeftButtonDown += (o, e) =>
                {
                    if (e.ClickCount >= 2)
                    {
                        maxBtn.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
                    }
                };
            }
        }
    }

           值转换器

          接下来我们看看值转换器的代码,值转换器有三个,1、窗体的边框只有左、下、右三面有,我们需要将配置给窗体的边框设置去掉顶部的边框设置后,配置给WindowBase内部的Border元素,该转换操作通过WindowBaseBorderThicknessConverter完成。2、窗体可能具有圆角,关闭按钮需要与窗体右边缘保持圆角指定值的边距,此时需要从Int型的圆角值转换为Thickness类型的边距,这是通过WindowBaseCloseMarginRightConverter实现的。3、最后一个转换器将Int型的圆角值转换为各个内部Border控件的CornerRadius。

    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Data;
    
    namespace youplus.OA.WpfApp.Converter
    {
        [ValueConversion(typeof(Thickness),typeof(Thickness))]
        public class WindowBaseBorderThicknessConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                Thickness t = (Thickness)value;
                return new Thickness(t.Left,0,t.Right,t.Bottom);
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }
    
        [ValueConversion(typeof(int), typeof(Thickness))]
        public class WindowBaseCloseMarginRightConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                int v = (int)value;
                return new Thickness(0, 0, v, 0);
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }
    
        [ValueConversion(typeof(int), typeof(CornerRadius))]
        public class WindowBaseCornerRadiusConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                int v = (int)value;
                string p = parameter.ToString().Trim().ToLower();
                if (p == "header")
                    return new CornerRadius(v, v, 0, 0);
                else if(p== "btnclose")
                    return new CornerRadius(0, v, 0, 0);
                else
                    return new CornerRadius(0, 0, v, v);
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }
    }

    WindowBase的使用

    接下来我们就需要将以上的自定义窗体应用到我们的MainWindow窗体上了,实例xaml代码如下所示

    <local:WindowBase x:Class="youplus.OA.WpfApp.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"
            xmlns:local="clr-namespace:youplus.OA.WpfApp"
            mc:Ignorable="d"
            Title="自定义窗体测试" CornerRadius="10"  Height="311" Width="493" Icon="Resources/logo.ico" WindowStartupLocation="CenterScreen">
        <Grid>
    
        </Grid>
    </local:WindowBase>

    转载于:https://www.cnblogs.com/alexywt/p/9968082.html

    展开全文
  • WPF不规则窗体应用工程样例 framework4.0 visual2010
  • WPF登录窗体

    千次阅读 2013-01-08 21:10:25
    利用闲暇时间帮一个亲戚做一个库存管理系统,由于是一个C/S应用,于是用WPF来做,也是第一次用WPF真正意义上的实践吧,下面是登录窗口相关代码:<Window x:Class="David.WPF.Login" xmlns=...
  • wpf窗体设置

    2013-06-20 10:38:02
    wpf窗体中几个属性 WindowStartupLocation="CenterScreen"(窗体初始化位置) AllowsTransparency="True" WindowStyle="None"(窗体样式是否有最大最小等图标) WindowState="Maximized"(窗体初始化为最大...
  • WPF自适应窗体大小

    千次阅读 2010-12-14 15:15:00
    我的WPF应用程序启动时的窗体大小为900*700。当windows的分辨率为1280*1024的时候。再次启动我的WPF程序时。窗体包括各个控件以及窗体的各个部位的文字、图片等都等比例放大。 这个在winform中要自己写缩放代码...
  • WPF 父子窗体联动

    2018-01-10 23:41:00
     近段时间,由于项目上的一些原因,设计到在WPF项目使用引用COM组件的问题,部分WPF元素浮动在COM组件之上,并且实现拖、停靠、放大等功能(子窗体不要求等比缩放,只要位置跟随主窗体即可),如图:   如何实现...
  • WPF 自定义窗体

    2017-03-03 13:34:24
    xmlns:local="clr-namespace:WpfApplication4"> <!--若不设置margin,阴影无法显示(被挡住了)--> *"/> ...
  • 我们可以简单的实例化一个WPF窗体对象然后在Office应用程序的窗体上打开这个新的WPF窗体,此时Office应用的窗体就是这个WPF的宿主窗体,这个WPF窗体是Office应用窗体的“子窗体”。然后子窗体跟宿主不是在一个U...
  • WPF浮动窗体控件(源码)

    热门讨论 2011-10-12 11:08:04
    WPF应用程序的浮动窗体控件,VS2010工具箱那种自动隐藏的
  • 壹般来说,壹个应用程序是由若干个窗体构成的,通过适当的交互逻辑在不同窗体之间建立起联系。当主窗体不方便直接调用子窗体内部的方法时,可通过委托的方式来间接调用。只需要子窗体定义壹个满足主窗体声明的委托...
  • WPF MVVM窗体设计基础

    2019-07-07 13:39:59
    WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架,属于.NET Framework 3.0的一部分。它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供...
  • WINDOWS窗体应用程序与WPF应用程序的区别? 用WPF更容易做的漂亮 感觉有以下几个大区别: WPF的线程模型和winform的线程模型不同 WPF到处用到数据绑定,winform在列表中才用的 WPF支持3D,winform本身没有,...
  • C/S WPF(窗体)

    2016-10-20 08:48:52
    C/S WPF (简介,定义,特点,运行环境,窗体截图,设计) WPF简介: WPF(Windows Presentation Foundation)是微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分。它提供了统一的...
  • WPF:窗体置顶

    2016-05-10 17:17:00
    1、设置窗体TopMost属性 private DispatcherTimer timer; public Window1() { InitializeComponent(); Loaded += new RoutedEventHandler(Window1_Loaded); } void Window1_Loaded(object sender,...
  • WPF窗体属性

    2019-08-07 20:10:55
    WPF项目里,窗体是必不可少的,他作为一个载体,他的属性也是十分重要的。下面就列举一些WPF窗体属性。 一、窗体的外观 WPF中默认窗口框架的外观,主要取决于Icon、Title、WindowsStyle、ResizeMode等属性。...
  • WPF应用程式中,我们往往想为一个窗体设置一个中意的背景图,而不是单独的为这个Background设置成某种颜色或渐变颜色的背景。 在WPF 利用Expression Blend工具如何达到这种效果呢?比如我们想做一个登陆窗体界面,...
  • wpf窗体项目运行之后bin/debug下面只有.exe文件,现在想要生成dll文件供其他第三方引用的实现方法。 1、删除App.xaml文件 2、将项目属性--应用程序--输出类型 改为类库。 下面可以没有,经测试,上...
  • WPF是制作界面的一大利器,下面这篇文章主要给大家介绍了关于自定义WPF窗体形状的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们一起来看看吧
  • WPF窗体

    千次阅读 2012-07-07 09:50:58
    一、窗体类 在Visual Studio和Expression Blend中,自定义的窗体均继承System.Windows.Window类(类型化窗体)。定义的窗体由两部分组成: 1、XAML文件 1: Window 2: xmlns=...
  • WPF 窗体布局

    2016-11-21 14:16:16
    wpf中如果不进行控件布局的设置,我们做出的应用调整窗口大小以后不能随窗体的大小而变化。 WPF布局案例:TextBox 随窗体的变化而变化 源码: Window x:Class="OscarSystemV2012.Views.CustomerSystem.Window1" ...
  • wpf窗体定位

    2018-08-01 17:05:00
    wpf窗体定位 原文:wpf窗体定位据WPF外包小编了解,通常,不需要在屏幕上明确定位窗口。而是简单地将WindowState属性设置为Normal,并忽略其他所有细节。另一方面,很少会将WindowStartupLocation属性...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,379
精华内容 3,351
关键字:

wpf多窗体应用