精华内容
下载资源
问答
  • 如何实现一个窗口的风格(style),让所有的窗口继承这样同样的风格,包括标题栏,放大、缩小和关闭按钮。 那么,我们可不可以就建立一个Base窗口,然后将这个窗口的风格给设计好之后,所有的窗口继承自他呢? ...

    如何实现一个窗口的风格(style),让所有的窗口都继承这样同样的风格,包括标题栏,放大、缩小和关闭按钮。

     那么,我们可不可以就建立一个Base窗口,然后将这个窗口的风格给设计好之后,所有的窗口都继承自他呢?

    答案是否定的,我们一定要知道,窗口是一个类,它可以继承,但是风格(XAML)文件是继承不了的。

    所以我们能够做到的是:

    1、窗口类继承,BaseWindow封装窗口最大化按钮,最小化按钮的点击等事件。

    2、风格(Style)就利用属性来设置,把window看成一个控件,利用Style=“BaseWindowStyle”就可以了。

    以下是详细的步骤:

    1、新建一个BaseWindowStyle的模板文件。点击项目名称,右键“添加”->”资源字典”->输入名称为“BaseWindowStyle.xaml”,然后将以下的末班文件拷贝进去:

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    
        <ControlTemplate x:Key="WindowTemplateKey"
                         TargetType="{x:Type Window}">
            <Border Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}">
                <Grid>
                    <AdornerDecorator>
                        <ContentPresenter />
                    </AdornerDecorator>
                    <ResizeGrip Visibility="Collapsed"
                                IsTabStop="false"
                                HorizontalAlignment="Right"
                                x:Name="WindowResizeGrip"
                                VerticalAlignment="Bottom" />
                </Grid>
            </Border>
            <ControlTemplate.Triggers>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="ResizeMode"
                                   Value="CanResizeWithGrip" />
                        <Condition Property="WindowState"
                                   Value="Normal" />
                    </MultiTrigger.Conditions>
                    <Setter Property="Visibility"
                            TargetName="WindowResizeGrip"
                            Value="Visible" />
                </MultiTrigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
        <ControlTemplate x:Key="BaseWindowControlTemplate" TargetType="{x:Type Window}">
            <DockPanel LastChildFill="True">
                <!--外边框-->
                <Border Width="Auto"
                        Height="Auto"
                        DockPanel.Dock="Top"
                        Background="#FF7097D0"
                        CornerRadius="0,0,0,0"
                        x:Name="borderTitle">
    
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*">
                                
                            </ColumnDefinition>
                            <ColumnDefinition Width="*">
    
                            </ColumnDefinition>
    
                        </Grid.ColumnDefinitions>
    
    
                        <TextBlock Grid.Column="0"   Margin="20,0,2,2"  Name="Title" VerticalAlignment="Top" FontSize="20" 
              Foreground="White" Text="{TemplateBinding Title}"/>
                        <StackPanel Grid.Column="1" HorizontalAlignment="Right" 
                                Orientation="Horizontal">
    
                            <!--最小化按钮-->
                            <Button x:Name="btnMin" Content="M" Margin="2,2,2,2" Style="{DynamicResource MinButtonStyle}"/>
    
    
                            <!--最大化按钮-->
                            <Button x:Name="btnMax" Content="M" Margin="2,2,2,2" Style="{DynamicResource MaxButtonStyle}"/>
                            <!--关闭按钮-->
                            <Button x:Name="btnClose" Content="M" Margin="2,2,2,2" Style="{DynamicResource CloseButtonStyle}"/>
                        </StackPanel>
                    </Grid>
    
    
                </Border>
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        Width="Auto"
                        Height="Auto"
                        DockPanel.Dock="Top"
                        CornerRadius="0,0,4,4">
                    <AdornerDecorator>
                        <ContentPresenter />
                    </AdornerDecorator>
                </Border>
            </DockPanel>
        </ControlTemplate>
        <Style x:Key="BaseWindowStyle"
               TargetType="{x:Type Window}">
            <Setter Property="Foreground"
                    Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}" />
            <Setter Property="Background"
                    Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}" />
            <Setter Property="Template" Value="{StaticResource BaseWindowControlTemplate}"/>
                
            <Setter Property="AllowsTransparency"
                    Value="True" />
            <Setter Property="WindowStyle"
                    Value="None" />
            <Setter Property="BorderBrush"
                    Value="#FF7097D0" />
            <Setter Property="BorderThickness"
                    Value="4,4,4,4" />
            <Style.Triggers>
                <Trigger Property="ResizeMode"
                         Value="CanResizeWithGrip">
                    <Setter Property="Template"
                            Value="{StaticResource WindowTemplateKey}" />
                </Trigger>
            </Style.Triggers>
        </Style>
        <!--最小化按钮-->
        <Style x:Key="MinButtonStyle" TargetType="{x:Type Button}">
    
            <Setter Property="Foreground" Value="Black"/>
            <!--修改模板属性-->
            <Setter Property="Template">
                <Setter.Value>
                    <!--控件模板-->
                    <ControlTemplate TargetType="Button">
                        <!--背景色-->
                        <Border x:Name="back" Opacity="0.8" CornerRadius="0" BorderBrush="#FFCDA05F" Background="#FFFFE9C9" BorderThickness="1" Margin="1" Padding="2,0,0,0">
                            <!--按钮内容-->
                            <Path x:Name="cp" Width="12" Height="12"  
                                      Stroke="#FFCEA15F"  
                                      StrokeThickness="3" Fill="Black">
    
                                <Path.Data>
                                    <PathGeometry Figures="M 0,6 H 6,6 " />
                                </Path.Data>
                            </Path>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
    
                                <Setter Property="Background" TargetName="back" Value="#FFD4BD9B"/>
                            </Trigger>
                            <Trigger Property="IsPressed" Value="True">
                                <Setter Property="Background" TargetName="back" Value="#FFCDA05F"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    
        <!--最大化按钮-->
        <Style x:Key="MaxButtonStyle" TargetType="{x:Type Button}">
    
            <Setter Property="Foreground" Value="Black"/>
            <!--修改模板属性-->
            <Setter Property="Template">
                <Setter.Value>
                    <!--控件模板-->
                    <ControlTemplate TargetType="Button">
                        <!--背景色-->
                        <Border x:Name="back" Opacity="0.8" CornerRadius="0" BorderBrush="#FFCDA05F" Background="#FFFFE9C9" BorderThickness="1" Margin="1" Padding="2,0,0,0">
                            <!--按钮内容-->
                            <Path x:Name="cp" Width="12" Height="12"  
                                      Stroke="#FFCEA15F"  
                                      StrokeThickness="3" >
    
                                <Path.Data>
                                    <PathGeometry Figures="M 0,0 L 0,12 12,12 12,0 0,0" />
                                </Path.Data>
                            </Path>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
    
                                <Setter Property="Background" TargetName="back" Value="#FFD4BD9B"/>
                            </Trigger>
                            <Trigger Property="IsPressed" Value="True">
                                <Setter Property="Background" TargetName="back" Value="#FFCDA05F"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    
        <!--关闭按钮-->
        <Style x:Key="CloseButtonStyle" TargetType="{x:Type Button}">
    
            <Setter Property="Foreground" Value="Black"/>
            <!--修改模板属性-->
            <Setter Property="Template">
                <Setter.Value>
                    <!--控件模板-->
                    <ControlTemplate TargetType="Button">
                        <!--背景色-->
                        <Border x:Name="back" Opacity="0.8" CornerRadius="0" BorderBrush="#FFCDA05F" Background="#FFFFE9C9" BorderThickness="1" Margin="1" Padding="2,0,0,0">
                            <!--按钮内容-->
                            <Path x:Name="cp" Width="12" Height="12"  
                                      Stroke="#FFCEA15F"  
                                      StrokeThickness="3" >
    
                                <Path.Data>
                                    <PathGeometry Figures="M 0,0 L 12,12 M 0,12 L 12,0" />
                                </Path.Data>
                            </Path>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
    
                                <Setter Property="Background" TargetName="back" Value="#FFD4BD9B"/>
                            </Trigger>
                            <Trigger Property="IsPressed" Value="True">
                                <Setter Property="Background" TargetName="back" Value="#FFCDA05F"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    
    
    </ResourceDictionary>

     

    2、引用该模板文件。资源文件建立后,我们需要在程序中引用这个文件,打开APP.XAML,将引用的BaseWindowStyle添加进去:

    <Application
                 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" x:Class="MyFirst.App"
                 StartupUri="MainWindow.xaml">
        <Application.Resources>
    
            <ResourceDictionary Source="BaseWindowStyle.xaml">
    
            </ResourceDictionary>
    
        </Application.Resources>
    </Application>

    3、建立BaseWindow类,实现窗口点击,拖动等事件。在工程上点击右键“添加”->“类”->输入”BaseWindow.cs“

    该类继承自Window,然后要载入模板文件,在模板文件中获取最小化、最大化等按钮,然后将这些按钮的点击事件和窗口绑定起来,实现窗口的响应:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Input;
    
    
    namespace MyFirst
    {
        public class BaseWindow : Window
        {
            public BaseWindow()
            {
                InitializeStyle();
                this.Loaded += delegate
                {
                    InitializeEvent();
                };
            }
    
            private void InitializeEvent()
            {
                ControlTemplate baseWindowTemplate = (ControlTemplate)App.Current.Resources["BaseWindowControlTemplate"];
    
                Button minBtn = (Button)baseWindowTemplate.FindName("btnMin", this);
                minBtn.Click += delegate
                {
               
                    this.WindowState = WindowState.Minimized;
                };
    
                Button maxBtn = (Button)baseWindowTemplate.FindName("btnMax", this);
                maxBtn.Click += delegate
                {
                   
                    this.WindowState = (this.WindowState == WindowState.Normal ? WindowState.Maximized : WindowState.Normal);
                };
    
                Button closeBtn = (Button)baseWindowTemplate.FindName("btnClose", this);
                closeBtn.Click += delegate
                {
                    this.Close();
                };
    
                Border borderTitle = (Border)baseWindowTemplate.FindName("borderTitle", this);
                borderTitle.MouseMove += delegate(object sender, MouseEventArgs e)
                {
                    if (e.LeftButton == MouseButtonState.Pressed)
                    {
                        this.DragMove();
                    }
                };
                borderTitle.MouseLeftButtonDown += delegate(object sender, MouseButtonEventArgs e)
                {
                    if (e.ClickCount >= 2)
                    {
                        maxBtn.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
                    }
                };
            }
    
    
            private void InitializeStyle()
            {
                this.Style = (Style)App.Current.Resources["BaseWindowStyle"];
            }
        }
    }

     

    4,其它窗口类继承自BaseWindow:

    public partial class MainWindow : BaseWindow

    5,其它窗口的风格指向BaseWindowStyle。

    这里要注意一点Winodow的风格可不是直接 Style=”BaseWindowStyle” 那么简单,可以看看MainWindow.xaml的代码:

    <local:BaseWindow x:Class="MyFirst.Login"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:src="clr-namespace:MyFirst"
            Title="MainWindow" Height="300" Width="300">
        
    
    </local:BaseWindow>

     

    经过这么多步,我们终于实现了凡是继承自BaseWindow的窗口,都有统一的风格了!

    WPF窗口继承

    当然,如上的窗口还不是那么漂亮完美,但是相信你有办法把它做的美美的!

    转载于:https://www.cnblogs.com/DreamRecorder/p/9662081.html

    展开全文
  • WPF窗口直接类继承

    2015-07-16 19:53:03
    WPF窗口集成比较困难,所以直接集成窗口类,使用单一的窗口来处理请求,用具体类实现方法。 下载的兄弟不要嫌太简单,这也是小弟琢磨了很久的成果。
  • WPF继承窗口 或控件

    千次阅读 2018-03-13 17:55:26
    WPF自定义窗口基类时,窗口基类只定义.cs文件,xaml文件不定义。继承自定义窗口的类xaml文件的根节点就不再是&lt;Window&gt;,而是自定义窗口类名(若自定义窗口继承者不在同一个命名空间,还得加上命名...

    WPF自定义窗口基类时,窗口基类只定义.cs文件,xaml文件不定义。继承自定义窗口的类xaml文件的根节点就不再是<Window>,
    而是自定义窗口类名(若自定义窗口与继承者不在同一个命名空间,还得加上命名空间),继承自定义窗口类后台代码也得修改为继承自自定义窗口
    exp:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    //继承Window类的自定义窗口类
    namespace WPF_Study.Entity
    {
       using System.Windows;
     
       public class WindowBase:Window
        {
            private const int Fixed_Width = 540;
            private const int Fixed_Height = 350;
     
            public WindowBase() : base()
            {
                this.MaxWidth = Fixed_Width;
                this.MaxHeight = Fixed_Height;
                this.MinWidth = Fixed_Width;
                this.MinHeight = Fixed_Height;
            }
        }
    }
     
    //继承自定义窗口
    //xaml文件
    <localEntity:WindowBase x:Class="WPF_Study.TestWindowBase"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:localEntity="clr-namespace:WPF_Study.Entity"
            Title="TestWindowBase" >
        <Grid>
            <Grid.Resources>
                <Style TargetType="{x:Type Button}">
                    <Setter Property="Width" Value="60"/>
                    <Setter Property="Height" Value="30"/>
                    <Setter Property="Margin" Value="5"/>
                </Style>
            </Grid.Resources>
            <Grid.RowDefinitions>
                <RowDefinition Height="40*"/>
                <RowDefinition Height="221*"/>
            </Grid.RowDefinitions>
            <WrapPanel Grid.Row="0" Grid.Column="0">
                <Button Content="查询" x:Name="btnSearch"></Button>
                <Button Content="新增" x:Name="btnAdd"></Button>
                <Button Content="修改" x:Name="btnAmend"></Button>
                <Button Content="删除" x:Name="btnDelete"></Button>
            </WrapPanel>
            <DataGrid x:Name="dataGrid" AutoGenerateColumns="False" Grid.Row="2" Grid.Column="0" CanUserAddRows="False">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="窗口编号" Binding="{Binding Win}"/>
                    <DataGridTextColumn Header="评价器地址" Binding="{Binding Evalutor}"/>
                    <DataGridTextColumn Header="条屏地址" Binding="{Binding StripeScreen}"/>
                    <DataGridTextColumn Header="IP" Binding="{Binding IP}"/>
                    <DataGridTextColumn Header="注册设备号" Binding="{Binding RegNum}"/>
                    <DataGridTextColumn Header="描述" Binding="{Binding Description}" Width="*"/>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </localEntity:WindowBase>
    //对应后台代码
    using WPF_Study.Entity;
     
    namespace WPF_Study
    {
        /// <summary>
        /// Interaction logic for TestWindowBase.xaml
        /// </summary>
        public partial class TestWindowBase : WindowBase
        {
            public TestWindowBase()
            {
                InitializeComponent();
            }
        }
    }

      

    展开全文
  • WPF继承自定义窗口

    千次阅读 2008-12-12 17:09:00
    WPF继承自定义窗口不像winform和asp.net那么容易假设我们写好的父窗口类为BaseWindow,对应BaseWindow.cs和BaseWindow.xaml, 要继承它的窗口为Window1,对应Window1.cs和Window1.xaml,我们常常进行的动作是将VS为...

    WPF继承自定义窗口不像winform和asp.net那么容易

    假设我们写好的父窗口类为BaseWindow,对应BaseWindow.cs和BaseWindow.xaml, 要继承它的窗口为Window1,对应Window1.cs和Window1.xaml,我们常常进行的动作是将VS为我们自动生成的代码中的如下语句:

      public partial class Window1 : Window

      修改成:

      public partial class Window1 : BaseWindow

      但编译后,你会得到一个错误:Window1有着不同的基类。

      这是因为在window1.xaml中


    <Window
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       x:Class="InheritWindowDemo.Window1"
       Width="300" Height="300">
       <Grid x:Name="LayoutRoot"/>
    </Window>

     

      我们的Window继承了Window类,打开Window1.g.cs也可以看到这一点(这是VS自动生成的一个中间文件,可以在Window1的InitializeComponent()方法上“转到定义”来跳转到该文件,也可以在Obj"Debug目录下找到)。这就使得我们的Window1同时继承Window和BaseWindow类,多继承是不被允许的。

      那么自然地,需要修改Window1.xaml,将其中的根“Window”,修改成我们的BaseWindow:

      


    <src:BaseWindow xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    x:Class="InheritWindowDemo.Window1"
                    xmlns:src="clr-namespace:InheritWindowDemo"
                    Height="300"
                    Width="300">
        <Grid>
        </Grid>
    </src:BaseWindow>

     

      心想,这下可以编译通过了吧,抱歉,不行,又得到另一个编译错误:src:BaseWindow不能是Xaml文件的根,因为它是由Xaml定义的,目前我避免这个问题的办法是让BaseWindow仅仅在C#中定义(即,没有BaseWindow.xaml,只有BaseWindow.cs)。

     

     

    展开全文
  • [WPF疑难] 继承自定义窗口 原文:[WPF疑难] 继承自定义窗口 [WPF疑难] 继承自定义窗口 周银辉 项目中有不少的弹出窗口,按照美工的设计其外边框(包括最大化,最小化,关闭等按钮)自然不同于...
    原文:[WPF疑难] 继承自定义窗口

     

                                                     [WPF疑难] 继承自定义窗口

    周银辉

    项目中有不少的弹出窗口,按照美工的设计其外边框(包括最大化,最小化,关闭等按钮)自然不同于Window自身的,但每个弹出框的外边框都是一样的。对其中一个窗口而言,我们要取消其Window边框,并在右上角摆上三个按钮并编写其点击事件等,但若每个弹出窗口都按照这种方式做一遍就太土了。我们想避免重复劳动,最自然的联想到了“继承”。但WPF给我们找了若干麻烦,被挫败了几次。今天经过2小时的奋战,终于搞定了,分享一下。

    挫败1,继承时编译错误

    假设我们写好的父窗口类为BaseWindow,对应BaseWindow.csBaseWindow.xaml, 要继承它的窗口为Window1,对应Window1.csWindow1.xaml,我们常常进行的动作是将VS为我们自动生成的代码中的如下语句:

    public partial class Window1 : Window

    修改成:

    public partial class Window1 : BaseWindow

    但编译后,你会得到一个错误:Window1有着不同的基类。

    这是因为在window1.xaml

    <Window

       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

       x:Class="InheritWindowDemo.Window1"

       Width="300" Height="300">

       <Grid x:Name="LayoutRoot"/>

    </Window>

    我们的Window继承了Window类,打开Window1.g.cs也可以看到这一点(这是VS自动生成的一个中间文件,可以在Window1InitializeComponent()方法上“转到定义”来跳转到该文件,也可以在Obj"Debug目录下找到)。这就使得我们的Window1同时继承WindowBaseWindow类,多继承是不被允许的。

    那么自然地,需要修改Window1.xaml,将其中的根“Window”,修改成我们的BaseWindow

    <src:BaseWindow xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

                  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

                    x:Class="InheritWindowDemo.Window1"

                    xmlns:src="clr-namespace:InheritWindowDemo"

                    Height="300"

                    Width="300">

        <Grid>

        </Grid>

    </src:BaseWindow>

    心想,这下可以编译通过了吧,抱歉,不行,又得到另一个编译错误:src:BaseWindow不能是Xaml文件的根,因为它是由Xaml定义的,目前我避免这个问题的办法是让BaseWindow仅仅在C#中定义(即,没有BaseWindow.xaml,只有BaseWindow.cs)。

    OK,编译顺利通过,继承成功。

    挫败2,外边框(包括最小化,最大化和关闭按钮)放在哪里

    明显,不能作为BaseWindow的内容,这是因为继承了BaseWindow的子类窗口(比如Window1)会覆盖BaseWindow的内容。

    假设BaseWindow这样编写:

            public BaseWindow()

            {

                Grid grid = new Grid();

                Button minBtn = new Button();

                Button maxBtn = new Button();

                Button closeBtn =new Button();

                //something to ini these buttons

                grid.Children.Add(minBtn);

                grid.Children.Add(maxBtn);

                grid.Children.Add(closeBtn);

                this.Content = grid;

            }

    当子类Window1如下定义时:

    <src:BaseWindow xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

                    x:Class="InheritWindowDemo.Window1"

                    xmlns:src="clr-namespace:InheritWindowDemo"

                    Height="300"

                    Width="300">

        <Grid>

            <TextBlock Text="hi , i am window1"/>

        </Grid>

    </src:BaseWindow>

    这样以来Window1中的GridTextBlock会覆盖BaseWindow的内容而仅仅看到“hiI am window1”的文本块而没有最小化最大化以及关闭按钮了。

    事实上,我们应该反过来想,Window也是一个控件,与其他控件一样其外观及其外观中的视觉元素仍然是由其StyleControlTemplate来定义的。想到这里,一切就变得简单了,我们应该将窗口外边框(包括最小化,最大化和关闭按钮)定义在其Template中,其他一些属性(比如是否支持透明等)定义在Style

    Template如下:

        <ControlTemplate x:Key="BaseWindowControlTemplate" TargetType="{x:Type Window}">

            <DockPanel LastChildFill="True">

                <!--外边框-->

                <Border Width="Auto"

                        Height="Auto"

                        DockPanel.Dock="Top"

                        Background="#FF7097D0"

                        CornerRadius="4,4,0,0"

                        x:Name="borderTitle">

                    <StackPanel HorizontalAlignment="Right"

                                Orientation="Horizontal">

                        <!--最小化按钮-->

                        <Button Content="Min"

                                x:Name="btnMin" />

                        <!--最大化按钮-->

                        <Button Content="Max"

                                x:Name="btnMax" />

                        <!--关闭按钮-->

                        <Button Content="Close"

                                x:Name="btnClose" />

                    </StackPanel>

                </Border>

                <Border Background="{TemplateBinding Background}"

                        BorderBrush="{TemplateBinding BorderBrush}"

                        BorderThickness="{TemplateBinding BorderThickness}"

                        Width="Auto"

                        Height="Auto"

                        DockPanel.Dock="Top"

                        CornerRadius="0,0,4,4">

                    <AdornerDecorator>

                        <ContentPresenter />

                    </AdornerDecorator>

                </Border>

            </DockPanel>

    </ControlTemplate>

    Style如下:

        <Style x:Key="BaseWindowStyle"

               TargetType="{x:Type Window}">

            <Setter Property="Template" Value="{StaticResource BaseWindowControlTemplate}"/>

               

            <Setter Property="AllowsTransparency"

                    Value="True" />

            <Setter Property="WindowStyle"

                    Value="None" />

            <Setter Property="BorderBrush"

                    Value="#FF7097D0" />

            <Setter Property="BorderThickness"

                    Value="4,0,4,4" />

            <!—Something else-->

        </Style>

    然后在BaseWindow的构造函数中指定其Style为我们定义的样式:

            private void InitializeStyle()

            {

                this.Style = (Style) App.Current.Resources["BaseWindowStyle"];

            }

    这样一来,所有继承了BaseWindow的窗体,都有我们统一定义的外观了。

    挫败3,让外边框(包括最小化,最大化和关闭按钮)响应事件

    只有外观还不够,至少得有鼠标事件吧。那最小化事件来说,要做的事情是找到定义在ControlTemplate中的btnMin这个Button控件,然后当其被点击时该ControlTemplate被应用到的那个窗体被最小化。

    FrameworkTemplate.FindName(string name, FrameworkElement templatedParent)方法可以做帮助我们找到指定的FrameworkTemplate被应用到templatedParent上后具有name名称的控件。

                ControlTemplate baseWindowTemplate = (ControlTemplate)App.Current.Resources["BaseWindowControlTemplate"];

                Button minBtn = (Button)baseWindowTemplate.FindName("btnMin", this);

                minBtn.Click += delegate

                {

                    this.WindowState = WindowState.Minimized;

                };

    其他事件同理:)不过值得提醒的是,上面这样的代码应该在窗体的StyleTemplate被应用之后,比如你可以在Loaded后编写使用上面的代码而不是直接放在构造方法中,否则FrameworkTemplate.FindName()方法将返回null

    至此,问题搞定。下载DEMOhttp://files.cnblogs.com/zhouyinhui/InheritWindowDemo.zip

    posted on 2018-07-11 01:28 NET未来之路 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/lonelyxmas/p/9292386.html

    展开全文
  • WPF继承窗体

    2012-09-07 17:00:25
    本实例讲述如何将一个带有风格的WPF窗体定义为可被继承的基类。
  • 把样式指定给一个窗口 <Window x:Class="ApiDemo2.View.BaseWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ...
  • 自定义WPF 窗口样式

    2018-11-07 00:58:00
    自定义WPF 窗口样式 原文:自定义WPF 窗口样式 自定义 Window 在客户端程序中,经常需要用到自定义一个 Window ,大部分是为了好看吧。做了很多研究和实践之后,...
  • WPF窗体继承

    2014-11-05 10:55:04
    http://blog.csdn.net/samsone/article/details/7190291
  • wpf 窗口传递参数

    2021-01-05 20:05:50
    这是主窗口的代码: public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } //当页面加载完成后执行 private void Window_Loaded(object sender, RoutedEventArg
  •  [WPF疑难] 继承自定义窗口 周银辉 项目中有不少的弹出窗口,按照美工的设计其外边框(包括最大化,最小化,关闭等按钮)自然不同于Window自身的,但每个弹出框的外边框都是一样的。对其中一个窗口...
  • wpf继承窗体样式

    2015-11-18 14:36:37
    wpf没有模板窗体,我就用样式写了一个窗体样式,然后所有页面继承这个窗体样式。为了统一所有页面的样式。
  • 深入浅出学WPF窗口- [WPF学习总结]

    千次阅读 2014-02-21 21:10:52
    最近虽然在学习WPF,但感觉没有什么实质性的学习成果,像一些更细节更低层的原理总是迷迷糊糊的,在研究WPF父窗口与子窗口之间的关系时,觉得应该更深入的去了解WPF窗口背后的实现技术,这样才能熟练的浅出使用它。...
  • WPF窗口最大化

    2015-12-10 22:10:00
    要实现的一个功能是可以编辑系统某一类表,这些表又含有不同的properties,properties数量也不相同,有二十来个的,也有一两个的,所以,popUp出来之后大小各异,很不好看,而且这个view继承自父类的ViewModel,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,847
精华内容 1,538
关键字:

wpf窗口继承