WPF 杂谈——资源文件

编写一个应用不免要用到WPF自己的控件。不论是WinForm仍是网页都会有本身的控件。只是在写法和用法上有所不一样而以。而控件命名却离不开那几个单词。因此不用担忧判断不出来哪一个是按扭,哪一个是文本框。举个例子吧。布局

HTML性能

 <input type="button" value="扭按" />

WinForm学习

 private System.Windows.Forms.Button button1;

WPFthis

  <Button  Content="按扭"/>

看到了吧。本质上来说没有什么区别。只要学习他的属性用法就能够了。spa

在设计业务界面的时候,咱们必定离不开对界面进行相应的布局。网页上经常会用到DIV+CSS来进行布局。只是笔者想要讲的不是要用到什么技术。而是用到的知识。如:HTML里面用于布局元素有DIV、SPAN、Table等。又比如如:WinForm里面经常会用Panel。那么WPF里面是否是也有相似这样子的知识点。这是固然了。值得注意的是PC端(C/S)和网页(B/S)在布局上有所不一样。PC端这边多出了一个布局方式的知识点。通常有分为绝对布局(AbsoluteLayout),边框布局(BorderLayout),流布局(FlowLayout),表格布局(TableLayout),锚点布局(AnchorLayout)等。可是不是什么布局都存在。这个要看设计这门技术的人有没有把全部的布局都包进来。设计

WPF用于布局的元素有:Grid,StackPanel,WrapPanel。这些全是布局方式的知识。以下3d

Grid:表格布局或是绝对布局。code

StackPanel:线性布局(要么垂直要么水平)。component

WrapPanel:流布局。orm

能够说上面这三个元素足够让大家布局出令流目的界面出来。可是这只是用于界面上的划分。而想要作的美丽和漂亮就要用到样式(Style)。

笔者学习WPF的样式,最开始是以CSS样式来学习。如:CSS有三种方式来实现——外部样式,内部样式,内嵌样式。WPF的样式(Style)实现有几种方式呢?笔者从开发过程得出来——二种。没有了内嵌样式。可是却又多出了一种概念。这个概念跟控件有关系。因此笔者就在网页上面下载了一个图片。以下

咱们能够从图片上看到全部经常使用到的控件都会继承于FrameworkElement类。在FrameworkElement类里面有一个属性叫Resources。这个属性里面能够建立和存放各类各样的样式。这就意味着每个控件都有本身的样式存放的地方。也就是说样式的做用能够控制到某个控件的范围。虽然网页也能够随时随地的建立CSS样式。只要在声明的Style里面就好了。可是他仍是做用于整个网页。因此WPF在控件或是Window窗体里面声明的样式笔者都喜欢叫他们为内部样式。

网页上的外部样式是引用一个外部文件。而这个外部文件里面存放大量的CSS样式。一样子WPF也是这样子的。可是有一个区别的——范围。网页上的外部文件最终做用只能是某个网页,可是WPF的做用能够是整个应用。不论是多少个Window,多少个UserControl。就是上一章中讲到的在Application里面设置引用的外部文件。也是笔者认为的外部样式。以下

 <ResourceDictionary Source="/FirstFloor.ModernUI;component/Assets/ModernUI.xaml" />

 即然每个控件都会有本身的样式资源,那问题来了——若是俩个样式对同一个对象进行修饰,那么他要什么样子选择呢?举一个小小的例子吧。

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="Foreground" Value="Red"></Setter>
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.Resources>
            <Style TargetType="TextBlock">
                <Setter Property="Foreground" Value="Blue"></Setter>
            </Style>
        </Grid.Resources>
        <TextBlock Text="1223"></TextBlock>
    </Grid>
</Window>

运行结果:

笔者在Window窗体里面写了一个对TextBlock控件进行修饰的样式,同时前景色设为红色。在Grid也写了一个对TextBlock控件进行修饰的样式,只是这个颜色为蓝色。结果咱们能够看到他会选择最近的样式。

上面列子里面笔者是对全部的TextBlock控件进行修饰。跟CSS样式里面的元素选择器有一点相似。每每通常用于自定义控件。还有一种写法,跟CSS样式里面的类选择器有一点相似。以下

 1     <Style x:Key="AlertButton" TargetType="ButtonBase" BasedOn="{StaticResource SystemButtonBase}">
 2         <Setter Property="Cursor" Value="Hand" />
 3         <Setter Property="Margin" Value="8"/>
 4         <Setter Property="Padding" Value="4"/>
 5         <Style.Triggers>
 6             <Trigger Property="IsMouseOver" Value="True">
 7                 <Setter Property="Opacity" Value=".7" />
 8             </Trigger>
 9             <Trigger Property="IsPressed" Value="True">
10                 <Setter Property="Opacity" Value=".4" />
11             </Trigger>
12         </Style.Triggers>
13     </Style>

上面的代码来自于开源项目FirstFloor.ModernUI里面的。“x:Key”就是至关于CSS样式里面的"."。除了这些以外咱们仍是能够看到baseOn,它用于继承的。相信你们均可以看得懂是什么意思。Setter用于设置当前的属性值。Style.Triggers用于一些触发动做设置。好比按扭按下时要发生一些什么样子的变化。Property="IsPressed" Value="True"就是至关于IF。当前按扭按下去时候,IsPressed的值会变成True。发现服合当前的一个触发条件。因而就开始执行相应的设置工做。如:上面透明度(Opacity)会成.4。

当前除了上面讲到的样式以外,资源还能够存放别的东西。如:颜色。算了。只有文字的说明不可以明显和直接。在笔者在举个列子吧。

 1 <Window x:Class="WpfApp.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         xmlns:sys="clr-namespace:System;assembly=mscorlib"
 5         Title="MainWindow" Height="350" Width="525">
 6     <Window.Resources>
 7         <sys:String x:Key="TestString">I am Aomi</sys:String>
 8     </Window.Resources>
 9     <Grid>
10         <TextBlock Text="{StaticResource TestString}"></TextBlock>
11     </Grid>
12 </Window>

运行结果:

咱们能够看到。资源文件不仅是样式,还能够存放一些系统的值。可是必定要注意引用。如上面的xmlns:sys="clr-namespace:System;assembly=mscorlib"。

在引用样式方面,WPF也分为静态和动态的差异。如上面是静态引用。动态则要用到关键字DynamicResource。那么动态资源和静态资源的概念就出来。记得之前有人问过笔者他们之间到底有什么差异。笔者连什么是动态资源,什么是静态资源都搞不清楚。

静态资源(StaticResource):会在加载xaml文件的时候进行初始化,并且只有一次。同时运行的时候是不能对资源进行相关的操做。这就意味着后面若是对资源进行修改,是不会同步相应的引用。

动态资源(DynamicResource):会在运行的时候进行初始化,同时运行的时候也能够操做。显而后面对资源进行修改会同步到相应的引用。

知道这些以后,让笔者作了例子吧。就按上面的列子稍微的修改一下吧。

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <sys:String x:Key="TestString">I am Aomi</sys:String>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto" />
            <RowDefinition Height="auto" />
        </Grid.RowDefinitions>
        <TextBlock x:Name="TbText" Grid.Row="0" Text="{DynamicResource TestString}"></TextBlock>
        <Button Grid.Row="1" Content="变化" Click="Button_Click"></Button>
    </Grid>
</Window>

后台按扭的代码:

 private void Button_Click(object sender, RoutedEventArgs e)
        {
            this.Resources["TestString"] ="aaa";
        }

动态资源的执行结果:

把上面的引用改为以下静态引用。

 <TextBlock x:Name="TbText" Grid.Row="0" Text="{StaticResource TestString}"></TextBlock>

静态资源的执行结果:

至于究竟是用动态资源好,仍是用静态资源好呢?笔者是这样子理解的:静态资源他只会在编译的时候加载一次。后面哪怕你修改他资源也不会发生变化。而动态资源会在编译的时候也初始化,只是这个时候的值并无被初始化。只有在运行过程当中须要的时候才会去加载值。因此呢?若是在项目过程当中不须要后面修改变化的话,能够试着用静态资源。要明白动态资源可不是加载一次哦。性能仍是要想想的。

相关文章
相关标签/搜索