精华内容
下载资源
问答
  • 2021-01-24 23:51:24

    一、美化信息修改界面的TextBlock控件

    1.1.资源

    资源是指那些项目中可以和C#代码分离的固定不变的信息。早在WPF出现之前windows应用程序就已经能够携带资源了。实际上就是把一些应用程序必须使用的资源与应用程序自身打包在一起,这样资源就不会意外丢失了,代价是应用程序体积会变大。资源文件是指不能直接执行的文件。各种编程语言的编译器会把这些文件编译进目标文件(最终的.exe或.dll文件),资源文件在目标文件里以二进制数据的形式存在,形成目标文件的资源段。而在WPF中资源文件以哪种形式保存,则由其所在文件的“生成操作”属性来决定。

    1.资源形式
    在WPF项目中,既可以包含嵌入的资源(将资源文件嵌入到Resources.resx中),又可以包含链接的资源(将资源文件单独保存在项目中,而在扩展名为.resx的文件中只保存资源文件的连接)。

    更多相关内容
  • WPF资源和样式

    2021-11-24 17:36:02
     WPF资源系统可以用来保存一些公有对象和样式,从而实现重用这些对象和样式的作用。而WPF样式是重用元素的格式的重要手段,可以理解样式就如CSS一样,尽管我们可以在每个控件中定义格式,但是如果多个控件都应用了...

    一、引言

       WPF资源系统可以用来保存一些公有对象和样式,从而实现重用这些对象和样式的作用。而WPF样式是重用元素的格式的重要手段,可以理解样式就如CSS一样,尽管我们可以在每个控件中定义格式,但是如果多个控件都应用了多个格式的时候,我们就可以把这些格式封装成格式,然后在资源中定义这个格式,之前如果用到这个格式就可以直接使用这个样式,从而达到重用格式的手段。从中可以发现,WPF资源和WPF样式是相关的,我们经常把样式定义在资源中。

    二、WPF资源详解

    2.1 资源基础介绍

      尽管可以在代码中创建和操作资源,但是通常都是以XAML标签的形式定义资源的。下面具体看看如何去定义一个资源,具体的XAML代码如下所示:

    复制代码

    <Window x:Class="ResourceDemo.ResourceUse"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="REsource" Height="100" Width="350"
            xmlns:sys="clr-namespace:System;assembly=mscorlib">
        <Window.Resources>
            <!--定义一个字符串资源-->
            <sys:String x:Key="nameStr">
                LearningHard博客:http://www.cnblogs.com/zhili/
            </sys:String>
        </Window.Resources>
        <StackPanel>
            <!--通过资源key来对资源进行使用-->
            <TextBlock Text="{StaticResource nameStr}" Margin="10"/>
        </StackPanel>
    </Window>

    复制代码

      每一个元素都有一个Resources属性,该属性存储了一个资源字典集合。关于资源字典将会在下面部分介绍。尽管每个元素都提供了Resources属性,但通常在窗口级别上定义资源,就如上面XAML代码所示的那样。因为每个元素都可以访问它自己的资源集合中的资源,也可以访问所有父元素的资源集合中的资源。

    2.2 静态资源和动态资源区别

       为了使用XAML标记中的资源,需要一种引用资源的方法,可以通过两个标记来进行引用资源:一个用于静态资源,另一个用于动态资源。在上面的XAML中,我们引用的方式就是静态资源的引用方式,因为我们指定了StaticResource。那静态资源和动态资源有什么区别呢?

      对于静态资源在第一次创建窗口时,一次性地设置完毕;而对于动态资源,如果发生了改变,则会重新应用资源。下面通过一个示例来演示下他们之间的区别。具体的XAML代码如下所示:

    复制代码

    <Window x:Class="ResourceDemo.DynamicResource"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="DynamicResource" Height="300" Width="300">
        <Window.Resources>
            <SolidColorBrush x:Key="RedBrush" Color="Red"></SolidColorBrush>
        </Window.Resources>
        <StackPanel Margin="5">
          <Button Background="{StaticResource RedBrush}" Margin="5" FontSize="14" Content="Use a Static Resource"/>
            <Button Background="{DynamicResource RedBrush}" Margin="5" FontSize="14" Content="Use a Dynamic Resource"/>
            <Button Margin="5" FontSize="14" Content="Change the RedBrush to Yellow" Click="ChangeBrushToYellow_Click"/>
        </StackPanel>
    </Window>

    复制代码

      对应改变资源按钮的后台代码如下所示:

    private void ChangeBrushToYellow_Click(object sender, RoutedEventArgs e)
            {
                // 改变资源
                this.Resources["RedBrush"] = new SolidColorBrush(Colors.Yellow);
            }

      运行上面程序,你将发现,当点击Change按钮之后,只改变了动态引用资源按钮的背景色,而静态引用按钮的背景却没有发生改变,具体效果图如下所示:

    2.3 资源字典

      在前面中讲到,每个Resources属性存储着一个资源字典集合。如果希望在多个项目之间共享资源的话,就可以创建一个资源字典。资源字段是一个简单的XAML文档,该文档就是用于存储资源的,可以通过右键项目->添加资源字典的方式来添加一个资源字典文件。下面具体看下如何去创建一个资源字典。具体的XAML代码如下:

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <SolidColorBrush x:Key="blueBrush" Color="Blue"/>
        <FontWeight x:Key="fontWeight">Bold</FontWeight>
    </ResourceDictionary>

      为了使用资源字典,需要将其合并到应用程序中资源集合位置,当然你也可以合并到窗口资源集合中,但是通常是合并到应用程序资源集合中,因为资源字典的目的就是在于多个窗体中共享,具体的XAML代码如下所示:

    复制代码

    <Application x:Class="ResourceDemo.App"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 StartupUri="DynamicResource.xaml">
        <Application.Resources>
            <!--合并资源字典到Application.Resources中-->
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="Generic.xaml"/>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Application.Resources>
    </Application>

    复制代码

      那怎样使用资源字典中定义的资源呢?其使用方式和引用资源的方式是一样的,一样是通过资源的Key属性来进行引用的,具体使用代码如下所示:

    复制代码

    <Window x:Class="ResourceDemo.ResourceUse"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="REsource" Height="100" Width="350"
            xmlns:sys="clr-namespace:System;assembly=mscorlib">
        <Window.Resources>
            <!--定义一个字符串资源-->
            <sys:String x:Key="nameStr">
                LearningHard博客:http://www.cnblogs.com/zhili/
            </sys:String>
        </Window.Resources>
        <StackPanel>
            <!--使用资源字典中定义的资源-->
            <Button  Margin="10" Background="{StaticResource blueBrush}" Content="Blue Button" FontWeight="{StaticResource fontWeight}"/>
            <!--通过资源key来对资源进行使用-->
            <TextBlock Text="{StaticResource nameStr}" Margin="10"/>
        </StackPanel>
    </Window>

    复制代码

      此时的运行效果如下图所示:

      前面只是介绍在当前应用程序下共享资源可以把资源字典合并到应用程序资源集合中,如果想在多个应用程序共享资源怎么办呢?最简单的方法就是在每个应用程序中拷贝一份资源字典的XAML文件,但是这样不能对版本进行控制,显然这不是一个好的办法。更好的办法是将资源字典编译到一个单独的类库程序集中,应用程序可以通过引用程序集的方式来共享资源。这样就达到了在多个应用程序中共享资源的目的。

      使用这种方式面临着另一个问题,即如何获得所需要的资源并在应用程序中使用资源。对此,可以采用两种方法。第一种办法是通过代码创建一个ResourceDictionary对象,再通过指定其Source属性来定位程序中资源字典文件,一旦创建了ResourceDictionary对象,就可以通过key来检索对应的资源,具体的实现代码如下:

      ResourceDictionary resourceDic = new ResourceDictionary();
                // ReusableDictionary.xaml是资源字典文件
                resourceDic.Source = new Uri("ResourceLibrary;component/ReusableDictionary.xaml", UriKind.Relative);
                SolidColorBrush blueBrush =(SolidColorBrush)resourceDic["BlueBrush"];

      这种方式不需要手动指定资源,当加载一个新的资源字典时,窗口中所有的DynamicResource引用都会自动引用新的资源,这样的方式可以用来构建动态的皮肤功能。

      另外一种办法可以使用ComponentResourceKey标记,使用ComponentResourceKey为资源创建键名。具体使用例子请参看博文:Defining and Using Shared Resources in a Custom Control Library

    三、WPF样式详解

      在前面介绍了WPF资源,使用资源可以在一个地方定义对象而在整个应用程序中重用它们,除了在资源中可以定义各种对象外,还可以定义样式,从而达到样式的重用。

      样式可以理解为元素的属性集合。与Web中的CSS类似。WPF可以指定具体的元素类型为目标,并且WPF样式还支持触发器,即当一个属性发生变化的时,触发器中的样式才会被应用。

    3.1 WPF样式使用

      之前WPF资源其实完全可以完成WPF样式的功能,只是WPF样式对资源中定义的对象进行了封装,使其存在于样式中,利于管理和应用,我们可以把一些公共的属性定义放在样式中进行定义,然后需要引用这些属性的控件只需要引用具体的样式即可,而不需要对这多个属性进行分别设置。下面XAML代码就是一个样式的使用示例:

    复制代码

    <Window x:Class="StyleDemo.StyleDefineAndUse"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="300" Width="400">
        <Window.Resources>
            <!--定义样式-->
            <Style TargetType="Button">
                <Setter Property="FontFamily" Value="Times New Roman" />
                <Setter Property="FontSize" Value="18" />
                <Setter Property="FontWeight" Value="Bold" />
            </Style>
        </Window.Resources>
        <StackPanel Margin="5">
            <!--由于前面定义的样式没有定义key标记,如果没有显示指定Style为null,这按钮将指定引用事先定义的样式-->
            <Button Padding="5" Margin="5">Customized Button</Button>
            <TextBlock Margin="5">Normal Content.</TextBlock>
            <!--使其不引用事先定义的样式-->
            <Button Padding="5" Margin="5" Style="{x:Null}">A Normal Button</Button>
        </StackPanel>
    </Window>

    复制代码

      具体的运行效果如下图所示:

      当样式中没有定义key标记时,则对应的样式会指定应用到目标对象上,上面XAML代码就是这种情况,如果显式为样式定义了key标记的话,则必须显式指定样式Key的方式,对应的样式才会被应用到目标对象上,下面具体看看这种情况。此时XAML代码如下所示:

    复制代码

    <Window x:Class="StyleDemo.ReuseFontWithStyles"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="ReuseFontWithStyles" Height="300" Width="300">
        <Window.Resources>
            <!--带有key标签的样式-->
            <Style TargetType="Button" x:Key="BigButtonStyle">
                <Setter Property="FontFamily" Value="Times New Roman" />
                <Setter Property="FontSize" Value="18" />
                <Setter Property="FontWeight" Value="Bold" />
            </Style>
        </Window.Resources>
        <StackPanel Margin="5">
            <!--如果不显式指定样式key将不会应用样式-->
            <Button Padding="5" Margin="5">Normal Button</Button>
            <Button Padding="5" Margin="5" Style="{StaticResource BigButtonStyle}">Big Button</Button>
            <TextBlock Margin="5">Normal Content.</TextBlock>
            <!--使其不引用事先定义的样式-->
            <Button Padding="5" Margin="5" Style="{x:Null}">A Normal Button</Button>
        </StackPanel>
    </Window>

    复制代码

      此时运行效果如下图所示:

    3.2 样式触发器

      WPF样式还支持触发器,在样式中定义的触发器,只有在该属性或事件发生时才会被触发,下面具体看看简单的样式触发器是如何定义和使用的,具体的XAML代码如下所示:

    复制代码

    <Window x:Class="StyleDemo.SimpleTriggers"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="SimpleTriggers" Height="300" Width="300">
        <Window.Resources>
            <Style x:Key="BigFontButton">
                <Style.Setters>
                    <Setter Property="Control.FontFamily" Value="Times New Roman" />
                    <Setter Property="Control.FontSize" Value="18" />
    
                </Style.Setters>
                <!--样式触发器-->
                <Style.Triggers>
                    <!--获得焦点时触发-->
                    <Trigger Property="Control.IsFocused" Value="True">
                        <Setter Property="Control.Foreground" Value="Red" />
                    </Trigger>
                    <!--鼠标移过时触发-->
                    <Trigger Property="Control.IsMouseOver" Value="True">
                        <Setter Property="Control.Foreground" Value="Yellow" />
                        <Setter Property="Control.FontWeight" Value="Bold" />
                    </Trigger>
                    <!--按钮按下时触发-->
                    <Trigger Property="Button.IsPressed" Value="True">
                        <Setter Property="Control.Foreground" Value="Blue" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Window.Resources>
    
        <StackPanel Margin="5">
            <Button Padding="5" Margin="5"
                Style="{StaticResource BigFontButton}" 
                  >A Big Button</Button>
            <TextBlock Margin="5">Normal Content.</TextBlock>
            <Button Padding="5" Margin="5"
                >A Normal Button</Button>
        </StackPanel>
    </Window>

    复制代码

      此时的运行效果如下图所示:

      上面定义的触发器都是在某个属性发生变化时触发的,也可以定义当某个事件激活时的触发器,我们也把这样的触发器称为事件触发器,下面示例定义的事件触发器是等待MouseEnter事件,一旦触发MouseEnter事件,则动态改变按钮的FontSize属性来形成动画效果,具体的XAML代码如下所示:

    复制代码

    <Window x:Class="StyleDemo.EventTrigger"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="EventTrigger" Height="300" Width="300">
        <Window.Resources>
            <Style x:Key="BigFontButton">
                <Style.Setters>
                    <Setter Property="Control.FontFamily" Value="Times New Roman" />
                    <Setter Property="Control.FontSize" Value="18" />
                    <Setter Property="Control.FontWeight" Value="Bold" />
                </Style.Setters>
                <Style.Triggers>
                    <!--定义事件触发器-->
                    <EventTrigger RoutedEvent="Mouse.MouseEnter">
                        <!--事件触发时只需的操作-->
                        <EventTrigger.Actions>
                            <!--把动画放在动画面板中-->
                            <BeginStoryboard>
                                <!--在0.2秒的时间内将字体放大到22单位-->
                                <Storyboard>
                                    <DoubleAnimation
                      Duration="0:0:0.2"
                      Storyboard.TargetProperty="FontSize"
                      To="22"  />
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger.Actions>
                    </EventTrigger>
                    <!--鼠标移开触发的事件-->
                    <EventTrigger RoutedEvent="Mouse.MouseLeave">
                        <EventTrigger.Actions>
                            <BeginStoryboard>
                                <!--在1秒的时间内将字体尺寸缩小到原来的大小-->
                                <!--如果目标字体尺寸没有明确指定,则WPF将默认使用第一次动画之前按钮的字体尺寸-->
                                <Storyboard>
                                    <DoubleAnimation
                      Duration="0:0:1"
                      Storyboard.TargetProperty="FontSize"  />
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger.Actions>
                    </EventTrigger>
                </Style.Triggers>
            </Style>     
        </Window.Resources>
        <StackPanel Margin="5">
            <Button Padding="5" Margin="5"
                Style="{StaticResource BigFontButton}" 
                  >A Big Button</Button>
            <TextBlock Margin="5">Normal Content.</TextBlock>
            <Button Padding="5" Margin="5"
                >A Normal Button</Button>
        </StackPanel>
    </Window>

    复制代码

      此时的运行效果如下图所示:

    四、小结

      到这里,WPF资源和样式的内容就介绍结束。总结为,WPF样式类似CSS,可以将多个属性定义在一个样式中,而样式又存放在资源中,资源成了样式和对象的容器。另外WPF样式还支持触发器功能,本文中演示了属性触发器和事件触发器的使用。在接下来一篇博文中将介绍WPF模板。

    展开全文
  • WPF样式模板

    千次阅读 2019-06-08 16:05:30
    一、WPF样式(Style) 类似于Web应用程序中的CSS...样式属于资源的一种,例如为Button定义统一的背景颜色字体: <Window.Resources> <Style TargetType="Button"> <Setter Property="Backgroun...

    一、WPF样式(Style)
    类似于Web应用程序中的CSS,在WPF中可以为控件定义统一的样式(Style)。样式属于资源的一种,例如为Button定义统一的背景颜色和字体:

      <Window.Resources>
            <Style TargetType="Button">
                <Setter Property="Background" Value="Yellow" />
                <Setter Property="Margin" Value="5" />
                <Setter Property="FontFamily" Value="Comic Sans MS"/>
                <Setter Property="FontSize" Value="14"/>
            </Style>
        </Window.Resources>
        <StackPanel>
            <Button>Button A</Button>
            <Button Foreground="Red" Background="White">Button B</Button>
    </StackPanel>
    

    执行如下:
    在这里插入图片描述
    从执行的结果上来看:
    • 在Style中定义的属性及值,影响到Window中的所有类型为Button的控件的样式
    • 在Button中可以新定义其他属性(如Foreground),覆盖Style中的定义(Background)
    这种样式,类似于CSS中的类型选择器,为某种类型定义样式。
    此外还可以在Style中加入x:Key属性,做为特定的样式(注意,这种也需要定义TargetType);定义时还可以基于已定义的某种样式,例如,基于刚才的Button的样式,更改字体的大小及文本的前景及背景颜色:

     <Window.Resources>
            <Style TargetType="Button">
                <Setter Property="Background" Value="Yellow" />
                <Setter Property="Margin" Value="5" />
                <Setter Property="FontFamily" Value="Comic Sans MS"/>
                <Setter Property="FontSize" Value="14"/>
            </Style>
            <Style TargetType="Button" x:Key="ButtonStyleA" BasedOn="{StaticResource {x:Type Button}}">
                <Setter Property="Background" Value="Green" />
                <Setter Property="Foreground" Value="Yellow" />
                <Setter Property="FontSize" Value="28"/>
            </Style>
        </Window.Resources>
        <StackPanel>
            <Button>Button A</Button>
            <Button Foreground="Red" Background="White">Button B</Button>
            <Button Style="{StaticResource ButtonStyleA}">Button C</Button>
            <Button Style="{StaticResource ButtonStyleA}" Content="Button D">
                <Button.Foreground>
                    <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                        <LinearGradientBrush.GradientStops>
                            <GradientStop Offset="0.0" Color="#FFFFFF" />
                            <GradientStop Offset="1.0" Color="#0000FF" />
                        </LinearGradientBrush.GradientStops>
                    </LinearGradientBrush>
                </Button.Foreground>
            </Button>
    </StackPanel>
    

    执行如下:
    在这里插入图片描述
    二、控件模板(ControlTemplate)
    当使用一个控件时,如果控件的属性、方法、事件满足程序的需求,但控件的外观不满足要求的时候,除了自定义控件这种方法外,我们还可以通过使用“控件模板”的方式更改控件的外观。例如定义一个圆形的按钮:
    二、控件模板(ControlTemplate)
    当使用一个控件时,如果控件的属性、方法、事件满足程序的需求,但控件的外观不满足要求的时候,除了自定义控件这种方法外,我们还可以通过使用“控件模板”的方式更改控件的外观。例如定义一个圆形的按钮:

    <Window.Resources>
              <Style TargetType="Button" x:Key="ButtonStyle">
                <!--设置按钮的默认的样式-->
                <Setter Property="FontFamily" Value="Comic Sans MS"/>
                <Setter Property="FontSize" Value="14"/>
                <Setter Property="Foreground" Value="Black" />
                <Setter Property="Background">
                    <Setter.Value>
                        <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                            <LinearGradientBrush.GradientStops>
                                <GradientStop Offset="0.0" Color="#fff" />
                                <GradientStop Offset="1.0" Color="#009" />
                            </LinearGradientBrush.GradientStops>
                        </LinearGradientBrush>
                    </Setter.Value>
                </Setter>
                <!--设置按钮的模板-->
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="Button">
                            <Grid>
                                <Ellipse Fill="{TemplateBinding Background}"/>
                                <ContentPresenter
                                   Margin="5"
                                   HorizontalAlignment="Center"
                                   VerticalAlignment="Center"/>
                            </Grid>
                     第28行:</ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Window.Resources>
        <StackPanel>
            <Button Margin="5" Style="{StaticResource ButtonStyle}" 
                  Width="100" Height="100" 
                   Content="My Button">
            </Button>
            <Button Margin="5" Width="200">Common Button</Button>
    </StackPanel>
    

    执行如下:
    在这里插入图片描述
    三、触发器(Trigger)
    值得注意的是,这个时候,对于此按钮,无论是否获得焦点、鼠标是处于其上方,显示的外观均是相同的,如果要定义以上的一些效果,可以使用触发器来实现。
    Style、ControlTemplate 和 DataTemplate 都具有 Triggers 属性,该属性可以包含一组触发器。某个属性值更改时,或某个事件引发时,触发器会相应地设置属性或启动操作(如动画操作)。
    触发器包含以下几种:
    • 属性触发器
    • EventTrigger 和 Storyboard
    • MultiTrigger、DataTrigger 和 MultiDataTrigger
    我们这里可以使用属性触发器来实现:
    例如,在ControlTemplate中(即上段代码28行前插入以下代码):

    <ControlTemplate.Triggers>
          <Trigger Property="IsMouseOver" Value="True">
                <!--鼠标在上移动时-->
                <Setter Property="Foreground" Value="Yellow" />
            </Trigger>
            <Trigger Property="IsKeyboardFocused" Value="True">
                <!--控件获得键盘焦点时-->
                <Setter Property="Foreground" Value="White" />
            </Trigger>
    </ControlTemplate.Triggers>
    

    当按键获得键盘焦点时:
    在这里插入图片描述
    鼠标在其上时:
    在这里插入图片描述

    展开全文
  • C#WPF XAML事件、资源样式 一、事件(Event) 1.XAML帮助应用管理用户输入,执行不同的行为 、引入增强型事件处理系统-Routed Event(路由事件)、事件常常被用于控制更改通知操作 。 (1).事件定义:事件系统在WPF...

    C#WPF XAML事件、资源、样式

    一、事件(Event)
    1.XAML帮助应用管理用户输入,执行不同的行为 、引入增强型事件处理系统-Routed Event(路由事件)、事件常常被用于控制更改通知操作 。
    (1).事件定义:事件系统在WPF中被升级进化称为路由事件(Routed Event),并在其基础上衍生出命令传递机制。这些机制很大程度上减少了对程序员的束缚,让程序的设计和实现更加灵活,模块之间的耦合度也进一步降低。
    (2)、可以通过对于控件,然后“转到定义”或者“查看定义”方式进行后台事件的创建,还可以通过Visual Studio 2015开发程序中属性窗口的事件功能双击相应的事件进行前后台一套完整的事件创建。
    在这里插入图片描述
    2.路由事件处理方式
    路由三种策略(处理方式)路由事件使用以下三种路由策略之一:
    (1)、浮升(冒泡): 调用事件源上的事件处理程序。 路由事件随后会路由到后续的父级元素,直到到达元素树的根。 大多数路由事件都使用浮升路由策略。 浮升路由事件通
    常用于报告来自不同控件或其他 UI 元素的输入或状态变化。
    (2)、隧道: 最初将调用元素树的根处的事件处理程序。 随后,路由事件将朝着路由事件的源节点元素(即引发路由事件的元素)方向,沿路由线路传播到后续的子元素。
    合成控件的过程中通常会使用或处理隧道路由事件,通过这种方式,可以有意地禁
    止复合部件中的事件,或者将其替换为特定于整个控件的事件。 在 WPF 中提供的输
    入事件通常是以隧道/浮升对实现的。 隧道事件有时又称作预览事件,这是由该对所
    使用的命名约定决定的。
    (3)、直接: 只有源元素本身才有机会调用处理程序以进行响应。 这类似于 Windows 窗
    体用于事件的 “路由”。 但是,与标准 CLR 事件不同,直接路由事件支持类处理 (类
    处理将在下一节中介绍) 并可由 EventSetter 和使用 EventTrigger 。
    (4)、冒泡事件:在逻辑树里一个根元素定义了一个事件充当“源元素”执行事件的过程是从“源元素”开始一直到根元素。
    (5)、 隧道事件:在逻辑树里一个根元素定义了一个事件充当“源元素”执行事件的过程是从根元素开始一直到“源元素”。
    (6)、直接路由事件:直接定位到事件上的按钮。
    在这里插入图片描述
    3.路由事件实现
    (1).路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件。路由事件是一个 CLR 事件,可以由 RoutedEvent 类的实例提供支持并由 Windows Presentation Foundation (WPF) 事件系统来处理。
    (2)、中断事件路由 :所有的路由事件都共享一个公共的事件数据基类 RoutedEventArgs。 RoutedEventArgs 定义了一个采用布尔值的 Handled 属性。 Handled 属性的目的在于,允许路由中的任何事件处理程序通过将 Handled 的值设置为 true 来将路由事件标记为“已处理”。
    (3)、结果为冒泡事件:点击粉红色区域“YesTB”首先弹出“TextBlock”,再弹出“Panel”弹出框,点击灰色区域弹出“button”提示弹出框。
    (4)、冒泡事件例子中:e.Handled=true加在YesTB_PreviewMouseUp中,加入后,点击YesTB,将只弹出“button”。
    (5)、预览事件(隧道事件)例子中:e.Handled=true家在StackPanel_PreviewMouseUp中,加入后,点击YesTB,将只弹出“panel”。
    在这里插入图片描述
    (6)、在 Windows Presentation Foundation (WPF) 中,元素以元素树结构形式排列。 父元素可以参与处理最初由元素树中的子元素引发的事件。 这都是因为事件路由。
    (7)、路由事件通常遵循以下两个路由策略之一:浮升(冒泡)和隧道。 此示例重点介绍浮升事件,并使用ButtonBase.Click事件可显示路由的工作原理。
    (8)、下面的示例创建两个Button控制,并使用XAML特性语法将事件处理程序附加到公用父元素,它在此示例中为StackPanel。 而不是将单个事件处理程序附加每个Button子元素,该示例使用特性语法将附加到的事件处理程序StackPanel父元素。 此事件处理模式展示了如何使用事件路由技术来减少附加处理程序的元素数。 每个的所有浮升事件Button通过父元素路由。
    (9)、请注意,在父StackPanel元素中,Click指定为该属性进行部分限定的命名的事件名称Button类。 Button类是ButtonBase派生的类具有Click事件在其成员列表中的。 如果要处理的事件不在附加路由事件处理程序的元素的成员列表中,则有必要使用这种部分限定技术来附加事件处理程序。
    在这里插入图片描述
    4.常用事件
    (1)、如常用的“MouseDown(鼠标点击事件)”、“MouseEnter(鼠标移入)”、
    “MouseLeave(鼠标移出)”、“MouseLeftButtonDown(鼠标左键按下)”、“MouseLeftButtonUp(鼠标右键按下)”等等。
    在这里插入图片描述
    二、资源
    1.资源理解:在应用程序的不同位置重用的对象,可以在任何元素上定义资源,但是资源通常是在根元素上定义的。当在页面根元素上定义一个资源时,页面逻辑树中的所有元素都可以访问它,并且您可以重用相同的资源来设置接受该资源表示的类型的任何属性的值。
    (1)、XAML资源的示例包括画笔和样式,每个框架级别的元素(FrameworkElement或FrameworkContentElement)都有一个resource属性,该属性包含资源定义的资源(作为ResourceDictionary)。
    在这里插入图片描述
    2.资源字典(ResourceDictionary)
    如果想用代码创建一个完整的WPF应用程序,且可能还想用代码在该应用程序中创建任
    何资源。为此,创建一个新的ResourceDictionary实例,然后使用对ResourceDictionary.
    add .的连续调用将所有资源添加到字典中。然后,使用由此创建的ResourceDictionary
    在页面范围或Application.Resources中出现的元素上设置Resources属性。还可以将
    ResourceDictionary作为独立对象维护,而不需要将其添加到元素中。但是,如果您这样做,您必须按项目键访问其中的资源,就好像它是一个通用字典一样。资源字典中的每
    个资源必须有一个惟一的键。在标记中定义资源时,通过x: key指令分配惟一的键。通
    常,键是字符串;但是,你也可以通过使用适当的标记扩展将其设置为其他对象类型。定
    义资源之后,可以使用指定键名的资源标记扩展语法引用要用于属性值的资源。
    3.资源字典分类
    (1)、WPF应用程序中,XAML资源分为StaticResource(静态资源) 和 DynamicResource(动态资源)。
    (2)、Windows8应用中,XAML资源仅支持StaticResource(静态资源),资源应用域不同,XAML资源可分为FrameworkElement.Resources和Application.Resources。
    (3)、FrameworkElement.Resources(页面资源字典)是将资源对象应用于同一个对象数的不同对象上,称之为页面资源,通常被定义在XAML页面根元素上。
    在这里插入图片描述
    (4)、放在Application.Resources是贯穿整个应用级别的资源,通常被定义在App.xaml页面。
    在这里插入图片描述
    (5)、Application.Resources(资源字典整合)。
    在这里插入图片描述
    4.合并资源字典属性
    所有的资源项在最终都会被整合到Resource Dictionary中的,也就是说无论是
    FrameworkElement的Resources,还是Window的Resources,还是Application的
    Resources,还是特定的ResourceDictionary中定义的resources在整个应用编译执行的
    时候实际上他们都在一起的作为可遍历集合共同存在于一个相对会话空间内的。 我们也
    提到过Resource的key是可以被允许有相同的,这样在遍历不同相对地址的Resource
    Dictionary时会根据StaticResource或者DynamicResource的lookup behavior来确定哪个有效。通常为了维护和灵活性的考虑,我们通常会将Resource Dictionary文件分成好几
    个,但在某些场合下我们只需要用其中某些资源,那么我么可以将资源从几个独立的文
    件中提取并合并。
    (1)、在“MainWindow.xaml”中设置样式,新建两个资源字典:Dictionary1.xaml、Dictionary2.xaml,在Dictionary1.xaml中设置画刷,Dictionary2.xaml中设置样式,然后通过“App.xaml”进行资源字典整合。
    在这里插入图片描述
    三、样式
    1.样式分类:属性样式(直接通过UI元素的属性设置的样式)、内联样式(通过在UI元素中入Style节点来设置样式)、引用样式(定义在资源字典中的样式)。
    在这里插入图片描述
    (1)、属性样式 :类似于在HTML中直接通过HTML元素属性设置的样式,直接在一个控件中设置的样式。
    在这里插入图片描述
    (2)、 内联样式内联样式和模板的限制
    在可扩展应用程序标记语言 (XAML)中 ,样式和模板属性在技术上可以通过以下两种方
    式之一进行设置。 您可以使用特性语法(属性语法)来引用资源中定义的样式,例如 < 对
    象 Style="{StaticResource myResourceKey }" …/> 。 或者,可以使用属性元素语法来
    定义内联样式。
    在这里插入图片描述
    (3)、页面级别的内联样式,实际上是设置元素的Style属性若内联样式与属性样式对同一属性进行设置,以属性设置的样式为准,如果把“Background=“SkyBlue””删除则样式背景变红色,体现了样式的优先级。
    在这里插入图片描述
    (4)、引用样式
    资源字典可在多处定义,因此引用样式也可以在多处定义,引用样式可以分为:
    (1).页面级样式(写在页面上)页面级样式定义在页面的资源字典中,作用范围为整个页面。
    (2).应用程序级样式:应用程序级样式(写在App.xaml里面与页面级样式的定义方式和应用方式相同,差别有两个方面:定义位置不同、作用范围不同。
    2.Style中的Setter
    (1)、Setter,设置器,(属性值的)在给属性赋值的时候一般都采用“属性名=属性值”的形式。Setter类的Property属性用来指明你想为目标的那个属性赋值;Setter类的Value属性则是你提供的属性值。
    (2)、例子中在Window的资源词典中放置一个针对TextBlock的Style,Style中使用若干
    Setter来设定TextBlock的一些属性,这样程序中的TextBlock就会具有统一的风格,除非你使用{x:Null}显示地清空Style。
    (2)、Style设置器里有两个值:Property(指定的是定义控件如:Button、TextBlock等等的属性如:TextBlock,其中TextBlock又有Text值,而Button里没有Text值)、Value值是样式“FontSize”里的值。
    (3)、<Window.Resources>没有设置 x:Key所以表示在<Window.Resources>里所有的TextBlock都应用到同一个样式。
    (4)、因为Style的内容属性是Setters,所以我们可以直接在

    (3)、下面例子中,当TextBox的Text长度小于8个字符时其Border会保持粉红色,当输入的数字长度小于8位数时,输入框为粉红色。
    在这里插入图片描述
    4.多数据条件触发器MultiDataTrigger
    有时我们会遇到要求多个数据条件同时满足时才能触发变化的需求,此时可以考虑使
    用MultiDataTrigger。
    5.由事件触发的EventTrigger
    EventTrigger是触发器中最特殊的一个。首先,它不是由属性值或数据的变化来触发
    而由事件来触发;其次,被触发后它并非应用一组Setter,而是执行一段动画。因此,UI
    层的动画效果往往与 EventTrigger事件触发,另一个由MouseLeave事件触发。
    (1)、鼠标移入元素从小变大。
    在这里插入图片描述

    展开全文
  • 样式属于资源的一种,例如为Button定义统一的背景颜色字体: <Window.Resources> <Style TargetType="Button"> <Setter Property="Background" Value="Yellow" /> </Style> </Window....
  • WPF样式模板

    2012-11-16 12:43:50
    文档经过我的整理,对于WPF中的资源学习有很好的借鉴。
  • WPF自定义样式模板

    2021-09-06 21:22:38
    ----自定义样式模板。 一、样式WPF中我们可以使用Style来设置控件的某些属性值,并使该设置影响到指定范围内的 所有该类控件或影响指定的某一控件,比如说我们想将窗口中的所有按钮都保持某一种 风格,那么我们...
  • WPF高级样式模板

    2021-08-29 18:52:17
    定义模板和样式。 二:在WPF中我们可以使用Style来设置控件的某些属性值,并使该设置影响到指定范围内的所有类控件或影响指定 的某一控件,比如说我们想将窗口中的所有按钮都保持一种风格,那么我们可以设置一个Style...
  • 1、组件资源(图片音频)对象资源(可重用的.net对象)2、资源存储在Resouces属性中,是一个键值对的集合类型3、StaticResource静态资源,一旦创建就不能改变,基本上说的资源指的就是这个4、DynamicResource动态...
  • Windows Presentation Foundation (WPF) 样式设置和模板化是指一套功能(样式模板、触发器演示图板),应用程序、文档或用户界面 (UI) 的设计人员使用这些功能可以创建更好的视觉效果,也可以对其产品的统一外观...
  • WPF 自定义Button样式

    2021-12-29 18:29:53
    前面几篇文章,实现了窗口样式的修改,下面开始往这个窗口里面添加各种控件,当然,所有控件都会使用自定义样式,代码也会在下方详细地列出。窗口模板的git地址:https://github.co...
  • WPF快速入门系列(6)——WPF资源和样式 一、引言  WPF资源系统可以用来保存一些公有对象和样式,从而实现重用这些对象和样式的作用。而WPF样式是重用元素的格式的重要手段,可以理解样式就如CSS...
  • 定义样式 <Style x:Key="radBase" TargetType="RadioButton"> <Setter Property="IsChecked" Value="False" /> <Setter Property="Background" Value="Transparent" /> <Setter Property=...
  • WPF继承默认样式

    2020-09-03 15:28:25
    WPF一般在..\Themes\Generic.xaml里定义整个系统所用控件的默认样式,以保持全局风格统一 <Style TargetType="Button"> <Setter Property="VerticalAlignment" Value="Center" /> <Setter ...
  • WPF模板样式

    2021-02-07 10:38:45
    模板样式设置(资源设置) 应用方式:在xaml中编写资源 xaml: <Page ...> <Page.Resources> <Style TargetType="Button" x:Key="FileButtonStyle"> <Style.Setters> <Setter Property=...
  •  WPF资源系统可以用来保存一些公有对象和样式,从而实现重用这些对象和样式的作用。而WPF样式是重用元素的格式的重要手段,可以理解样式就如CSS一样,尽管我们可以在每个控件中定义格式,但是如果多个控件都应用了...
  • WPF样式主题

    千次阅读 2022-04-06 11:51:19
    WPF的样式 窗体的样式就是每个控件Style属性,可以使静态资源也可以是动态资源,给窗体的所有控件都设置一个样式,就做到了换主题的功能...首先需要把资源样式引用到App.xaml中,然后把窗体的样式设置为对应的keyStyle=
  • 1.创建资源字典 项目右键 - 添加 - 资源字典 2.编辑模板 在design界面右键编辑模板,选择刚才创建的资源字典即可
  • WPF控件样式应用设置与存放方式(Tempalte,ControlTemplate,Style,Triggers,样式中启动动画)
  •  WPF资源系统可以用来保存一些公有对象和样式,从而实现重用这些对象和样式的作用。而WPF样式是重用元素的格式的重要手段,可以理解样式就如CSS一样,尽管我们可以在每个控件中定义格式,但是如果多个控件都应用了...
  • WPF基础教程(样式).pptx

    2020-05-25 20:33:40
    详细介绍了WPF样式资源、触发器等,适合新手学习,而样式则是组织重用以上的重要工具。不是使用重复的标记填充XAML, 通过Styles创建一系列封装所有这些细节的样式。然后通过Style属性应用封装好的样式。这点类似...
  • 原文:WPF XAML 资源样式模板属性存放位置 WPF的XAML 资源申明 类似HTML。 整体来说分3种1.行类资源样式属性 1.1 行内属性 <Button Content="按钮" Foreground="White" FontSize="30"></Button> 1.2 ...

空空如也

空空如也

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

wpf资源和样式模板