浅谈WPF之样式与资源

WPF通过样式,不仅可以方便的设置控件元素的展示方式,给用户呈现多样化的体验,还简化配置,避免重复设置元素的属性,以达到节约成本,提高工作效率的目的,样式也是资源的一种表现形式。本文以一个简单的小例子,简述如何设置WPF的样式以及资源的应用,仅供学习分享使用,如有不足之处,还请指正。

图片

什么是样式?

样式(Style)是组织和重用格式化选项的重要工具。不是使用重复的标记填充XAML,以便设置外边距、内边距、颜色以及字体等细节,而是创建一系列封装所有这些细节的样式,然后再需要之处通过属性来应用样式。

样式是可应用于元素的属性值集合。使用资源的最常见原因之一就是样式。

基础样式

1. 通过TargetType设置样式

通过控件类型,统一设置样式【如:字体,大小,边距等】,以便于形成统一的风格。如下所示:

图片

通过设置样式的TargetType="Button",则可以使所有的按钮应用同一个样式,统一风格。如下所示:

<Window x:Class="WpfApp1.SevenWindow"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:WpfApp1"mc:Ignorable="d"Title="基础样式示例" Height="250" Width="400"><Window.Resources><Style  TargetType="Button"  ><Setter Property="Button.Margin" Value="2,5,2,5"></Setter><Setter Property="Control.FontFamily" Value="SimSun-ExtB"></Setter><Setter Property="Control.FontSize" Value="18"></Setter>
</Style></Window.Resources><StackPanel><Button x:Name="button1" Content="第一个按钮"></Button><Button x:Name="button2" Content="第二个按钮" ></Button><Button x:Name="button3" Content="第三个按钮"></Button><Button x:Name="button4" Content="第四个按钮" ></Button></StackPanel>
</Window>

2. 通过Key设置样式

如果需要对每一个控件元素,都设置不同的样式,则可以通过不同的Key加以区分,如下所示:

图片

分别设置不同的样式,每一个样式都有一个唯一的Key,然后分别绑定到各个元素的Style属性上,如下所示:

<Window x:Class="WpfApp1.SevenWindow"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:WpfApp1"mc:Ignorable="d"Title="基础样式示例" Height="250" Width="400"><Window.Resources><Style TargetType="Button" ><Setter Property="Button.Margin" Value="2,5,2,5"></Setter><Setter Property="Control.FontFamily" Value="SimSun-ExtB"></Setter><Setter Property="Control.FontSize" Value="16"></Setter></Style><Style x:Key="first"><Setter Property="Control.Foreground" Value="Red"></Setter><Setter Property="Control.Background" Value="Gray"></Setter></Style><Style x:Key="second"><Setter Property="ItemsControl.Foreground" Value="Gold"></Setter><Setter Property="ItemsControl.Background" Value="DarkCyan"></Setter></Style><Style x:Key="third"><Setter Property="ItemsControl.Foreground" Value="White"></Setter><Setter Property="ItemsControl.Background" Value="DarkRed"></Setter></Style><Style x:Key="four"><Setter Property="ItemsControl.Foreground" Value="Blue"></Setter><Setter Property="ItemsControl.Background" Value="LightCoral"></Setter></Style></Window.Resources><StackPanel><Button x:Name="button1" Content="第一个按钮" Style="{StaticResource first}"></Button><Button x:Name="button2" Content="第二个按钮" Style="{StaticResource second}"></Button><Button x:Name="button3" Content="第三个按钮" Style="{StaticResource third}"></Button><Button x:Name="button4" Content="第四个按钮" Style="{StaticResource four}"></Button></StackPanel>
</Window>

3. 样式继承

通过仔细观察发现,在设置了单独样式以后,统一的样式失去了作用,说明每一个元素控件,只能绑定一个样式,那怎么办才能让统一样式起作用呢?答案就是面向对象思想中的继承。

在WPF中,通过设置BasedOn来继承父样式,如下所示:

图片

在每一个样式通过BasedOn属性继承父样式,如下所示:

<Window x:Class="WpfApp1.SevenWindow"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:WpfApp1"mc:Ignorable="d"Title="基础样式示例" Height="250" Width="400"><Window.Resources><Style x:Key="base" ><Setter Property="Control.Margin" Value="2,5,2,5"></Setter><Setter Property="Control.FontFamily" Value="SimSun-ExtB"></Setter><Setter Property="Control.FontSize" Value="18"></Setter></Style><Style x:Key="first" BasedOn="{StaticResource base}"><Setter Property="Control.Foreground" Value="Red"></Setter><Setter Property="Control.Background" Value="Gray"></Setter></Style><Style x:Key="second" BasedOn="{StaticResource base}"><Setter Property="ItemsControl.Foreground" Value="Gold"></Setter><Setter Property="ItemsControl.Background" Value="DarkCyan"></Setter></Style><Style x:Key="third" BasedOn="{StaticResource base}"><Setter Property="ItemsControl.Foreground" Value="White"></Setter><Setter Property="ItemsControl.Background" Value="DarkRed"></Setter></Style><Style x:Key="four" BasedOn="{StaticResource base}"><Setter Property="ItemsControl.Foreground" Value="Blue"></Setter><Setter Property="ItemsControl.Background" Value="LightCoral"></Setter></Style></Window.Resources><StackPanel><Button x:Name="button1" Content="第一个按钮" Style="{StaticResource first}"></Button><Button x:Name="button2" Content="第二个按钮" Style="{StaticResource second}"></Button><Button x:Name="button3" Content="第三个按钮" Style="{StaticResource third}"></Button><Button x:Name="button4" Content="第四个按钮" Style="{StaticResource four}"></Button></StackPanel>
</Window>

注意:如果样式要被其他样式继承,则最好不要使用TargetType指定。一般情况下,可能为报错【只能根据带有基类型“IFrameworkInputElement”的目标类型的 Style。】

4. 样式中绑定事件

在WPF中的样式中,通过EventSetter进行事件绑定,如下所示:

图片

在样式中,通过EventSetter设置事件,如下所示:

<Window x:Class="WpfApp1.SevenWindow"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:WpfApp1"mc:Ignorable="d"Title="基础样式示例" Height="250" Width="400"><Window.Resources><Style x:Key="base"><Setter Property="Control.Margin" Value="2,5,2,5"></Setter><Setter Property="Control.FontFamily" Value="SimSun-ExtB"></Setter><Setter Property="Control.FontSize" Value="18"></Setter></Style><Style x:Key="first" BasedOn="{StaticResource base}"><Setter Property="Control.Foreground" Value="Red"></Setter><Setter Property="Control.Background" Value="Gray"></Setter><EventSetter Event="Button.MouseEnter" Handler="FirstButton_MouseEnter"></EventSetter></Style></Window.Resources><StackPanel><Button x:Name="button1" Content="第一个按钮" Style="{StaticResource first}"></Button></StackPanel>
</Window>

其中FirstButton_MouseEnter,文后台定义的一个事件函数,如下所示:​​​​​​​

private void FirstButton_MouseEnter(object sender,MouseEventArgs e)
{Button btn = (Button)sender;MessageBox.Show("鼠标进入了 "+btn.Content.ToString()+" 呀!");
}
 

触发器

使用触发器可自动完成简单的样式的改变,不需要使用代码,也可以完成不少工作触发器通过Style.Trigger集合链接到样式。每个样式可以有任意多个触发器。每个触发器都是System.Windows.TriggerBase的实例。

TriggerBase的子类

图片

1. 基础触发器

触发器,是指当满足一定条件,然后触发相关的样式设置,如下所示:

图片

示例中设置了两个触发器:1.Control.IsMouseOver鼠标覆盖在按钮上时,设置对应的样式。2. Control.IsFocused,控件聚焦时,设置对应的样式。如下所示:

<Window x:Class="WpfApp1.EightWindow"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:WpfApp1"mc:Ignorable="d"Title="EightWindow" Height="350" Width="400"><Window.Resources><Style x:Key="first"><Setter Property="Control.Margin" Value="2,5,2,5"></Setter><Setter Property="Control.FontFamily" Value="SimSun-ExtB"></Setter><Setter Property="Control.FontSize" Value="18"></Setter><Setter Property="Control.Foreground" Value="Red"></Setter><Setter Property="Control.Background" Value="LightBlue"></Setter><Style.Triggers><Trigger Property="Control.IsMouseOver" Value="True"><Setter Property="ItemsControl.Background" Value="AliceBlue"></Setter><Setter Property="Control.FontSize" Value="28"></Setter></Trigger><Trigger Property="Control.IsFocused" Value="True"><Setter Property="ItemsControl.Background" Value="DarkGoldenrod"></Setter><Setter Property="Control.FontSize" Value="28"></Setter></Trigger></Style.Triggers></Style></Window.Resources><StackPanel><Button x:Name="button1" Content="第一个按钮" Style="{StaticResource first}"></Button></StackPanel>
</Window>

注意:如果样式触发器,设置了多个,且条件相互覆盖时,以最后的设置为准

2. 多条件触发器

如果需要多个条件同时满足,才能设置对应的样式,则可以通过MultiTrigger来设置,如下所示:

<Window x:Class="WpfApp1.EightWindow"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:WpfApp1"mc:Ignorable="d"Title="EightWindow" Height="350" Width="400"><Window.Resources><Style x:Key="first"><Setter Property="Control.Margin" Value="2,5,2,5"></Setter><Setter Property="Control.FontFamily" Value="SimSun-ExtB"></Setter><Setter Property="Control.FontSize" Value="18"></Setter><Setter Property="Control.Foreground" Value="Red"></Setter><Setter Property="Control.Background" Value="LightBlue"></Setter><Style.Triggers><MultiTrigger><MultiTrigger.Conditions><Condition Property="Control.IsMouseOver" Value="True"></Condition><Condition Property="Control.IsFocused" Value="True"></Condition></MultiTrigger.Conditions><MultiTrigger.Setters><Setter Property="ItemsControl.Background" Value="Gainsboro"></Setter><Setter Property="Control.FontSize" Value="20"></Setter></MultiTrigger.Setters></MultiTrigger></Style.Triggers></Style></Window.Resources><StackPanel><Button x:Name="button1" Content="第一个按钮" Style="{StaticResource first}"></Button><Button x:Name="button2" Content="第二个按钮" ></Button></StackPanel>
</Window>

3. 事件触发器

事件触发器,是指某一个事件发生时,触发的相关动作,主要用于动画,如下所示:

图片

当鼠标进入时,字体变大,当鼠标离开时,字体恢复,如下所示:​​​​​​​

<Window x:Class="WpfApp1.EightWindow"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:WpfApp1"mc:Ignorable="d"Title="EightWindow" Height="350" Width="400"><Window.Resources><Style x:Key="first"><Setter Property="Control.Margin" Value="2,5,2,5"></Setter><Setter Property="Control.FontFamily" Value="SimSun-ExtB"></Setter><Setter Property="Control.FontSize" Value="18"></Setter><Setter Property="Control.Foreground" Value="Red"></Setter><Setter Property="Control.Background" Value="LightBlue"></Setter><Style.Triggers><EventTrigger RoutedEvent="Mouse.MouseEnter" ><EventTrigger.Actions><BeginStoryboard><Storyboard><DoubleAnimation Duration="00:00:02" To="28" From="12" Storyboard.TargetProperty="FontSize"></DoubleAnimation></Storyboard></BeginStoryboard></EventTrigger.Actions></EventTrigger><EventTrigger RoutedEvent="Mouse.MouseLeave"><EventTrigger.Actions><BeginStoryboard><Storyboard><DoubleAnimation Duration="00:00:01" Storyboard.TargetProperty="FontSize" To="18"  /></Storyboard></BeginStoryboard></EventTrigger.Actions></EventTrigger></Style.Triggers></Style></Window.Resources><StackPanel><Button x:Name="button1" Content="第一个按钮" Style="{StaticResource first}"></Button><Button x:Name="button2" Content="第二个按钮" ></Button></StackPanel>
</Window>

什么是资源?

资源是可以在应用程序中的不同位置重复使用的对象。WPF不仅支持传统的程序级的资源,还有独具特色的对象级资源,每一个界面元素,都可以拥有自己的资源,并被子元素共享。

资源基础用法

通常情况下,资源是在Window.Resources节点下,便于Window下所有的子元素共享,如下示例所示:

图片

定义一个字符串类型的资源,在TextBlock中通过Text="{StaticResource default}"的方式进行引用。如下所示:

<Window x:Class="WpfApp1.TenWindow"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:WpfApp1"xmlns:sys="clr-namespace:System;assembly=mscorlib"mc:Ignorable="d"Title="资源基础示例" Height="250" Width="400"><Window.Resources><sys:String x:Key="default">沉舟侧畔千帆过,病树前头万木春</sys:String></Window.Resources><Grid><TextBlock x:Name="tbInfo" Text="{StaticResource default}" FontSize="20" Margin="10" Padding="10" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock></Grid>
</Window>

资源层级

WPF资源是采用从内到外,逐层进行查找的,如果在当前窗口未检索到资源,则继续到App.xaml中继续查找,示例如下所示:

图片

 在App.xaml中定义资源,然后在Window中应用资源,如下所示:

<Application x:Class="WpfApp1.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:WpfApp1"xmlns:sys="clr-namespace:System;assembly=mscorlib"StartupUri="TenWindow.xaml"><Application.Resources><sys:String x:Key="story">怀旧空吟闻笛赋,到乡翻似烂柯人。</sys:String></Application.Resources>
</Application>

在Window窗口中调用,和调用本地资源是一样的,如下所示:​​​​​​​

<Window x:Class="WpfApp1.TenWindow"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:WpfApp1"xmlns:sys="clr-namespace:System;assembly=mscorlib"mc:Ignorable="d"Title="资源基础示例" Height="250" Width="400"><Window.Resources><sys:String x:Key="default">沉舟侧畔千帆过,病树前头万木春。</sys:String></Window.Resources><Grid><Grid.RowDefinitions><RowDefinition></RowDefinition><RowDefinition></RowDefinition></Grid.RowDefinitions><TextBlock x:Name="tbInfo1" Grid.Row="0" Text="{StaticResource story}" FontSize="20" Margin="10" Padding="10" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock><TextBlock x:Name="tbInfo2" Grid.Row="1" Text="{StaticResource default}" FontSize="20" Margin="10" Padding="10" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock></Grid>
</Window>

资源分类

根据资源的加载时间点,资源分为两类,如下所示:

  1. 静态资源:静态资源是在程序启动初始化时进行加载且只加载一次的资源

  2. 动态资源:动态资源是在程序执行过程中,动态的去访问资源,会随着资源的改变而改变,所以动态资源对系统的消耗相对比较大

动态资源

上述的基础示例,采用的是静态资源的方式。动态资源则是在程序执行过程中随着资源的改变而改变。

两个按钮使用同一个资源【背景图片】,只是一个采用静态资源引用,一个采用动态资源引用,当资源发生改变时,一个不改变,一个实时变化。如下所示:

图片

 示例源码,如下所示:

<Window x:Class="WpfApp1.NineWindow"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:WpfApp1"mc:Ignorable="d"Title="资源基础示例" Height="320" Width="400"><Window.Resources><!--ViewportUnits——设置平铺的相对/绝对坐标,即图片在哪平铺。--><ImageBrush x:Key="one" Viewport="0 0 50 50" ViewportUnits="Absolute" TileMode="Tile" ImageSource="alan_logo.png" Opacity="0.3"></ImageBrush></Window.Resources><StackPanel Margin="5" x:Name="stackpanel1"><Button Content="第一个按钮" Name="first" Margin="5" Padding="25" FontSize="58" Background="{ StaticResource one}"></Button><Button Content="第二个按钮" Name="second" Margin="5" Padding="25" FontSize="58" Background="{ DynamicResource one}" Click="second_Click" ></Button></StackPanel>
</Window>

后台修改资源的代码如下所示:

private void second_Click(object sender, RoutedEventArgs e)
{var img = this.FindResource("one") as ImageBrush ;img = new ImageBrush(new BitmapImage(new Uri(@"imgs/alan_logo1.png", UriKind.Relative)));img.TileMode = TileMode.Tile;img.Opacity = 0.3;img.Viewport = new Rect(0, 0, 50, 50);img.ViewportUnits = BrushMappingMode.Absolute;this.Resources["one"] = img;//注意:此处是直接重写覆盖资源key=one的对象,并不是对原资源设置ImageSoure属性。两者效果不同
}

资源文件

资源文件位于Properties/Resources.resx中,如果想要在程序中访问资源文件的内容,则必须将访问修饰符设置成public,如下所示:

图片

在WPF中,通过Text="{x:Static prop:Resources.Password}"的方式,进行访问资源内容,示例如下:

图片

 示例源码如下:​​​​​​​

<Window x:Class="WpfApp1.ElevenWindow"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:WpfApp1"xmlns:prop="clr-namespace:WpfApp1.Properties"mc:Ignorable="d"Title="资源文件示例" Height="150" Width="400"><Grid><Grid.RowDefinitions><RowDefinition></RowDefinition><RowDefinition></RowDefinition><RowDefinition></RowDefinition></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="1*"></ColumnDefinition><ColumnDefinition Width="2*"></ColumnDefinition></Grid.ColumnDefinitions><TextBlock x:Name="tbUserName" Text="{x:Static prop:Resources.UserName}" VerticalAlignment="Center" HorizontalAlignment="Right"  Grid.Row="0" Grid.Column="0" Margin="5"></TextBlock><TextBox x:Name="txtUserName" Grid.Row="0" Grid.Column="1" Margin="5"></TextBox><TextBlock x:Name="tbPassword" Text="{x:Static prop:Resources.Password}"  VerticalAlignment="Center" HorizontalAlignment="Right"   Grid.Row="1" Grid.Column="0" Margin="5"></TextBlock><TextBox x:Name="txtPassword" Grid.Row="1" Grid.Column="1" Margin="5"></TextBox><Button x:Name="btnSubmit" Content="{x:Static prop:Resources.Submit}" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" Width="150" Margin="5"></Button></Grid>
</Window>

资源字典

资源字典可以实现资源的共享,一份定义,多处使用的效果。具有可维护性,高效,适应性等优势

首先创建资源字典文件,通过程序右键--添加--资源字典,打开资源字典对话框,创建名称为OneDictionary.xaml,如下所示:

图片

 资源字典中创建了五个资源,如下所示:

<ResourceDictionary 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"xmlns:local="clr-namespace:WpfApp1"><sys:String x:Key="story0">酬乐天扬州初逢席上见赠</sys:String><sys:String x:Key="story1">【作者】刘禹锡 【朝代】唐</sys:String><sys:String x:Key="story2">巴山楚水凄凉地,二十三年弃置身。</sys:String><sys:String x:Key="story3">怀旧空吟闻笛赋,到乡翻似烂柯人。</sys:String><sys:String x:Key="story4">沉舟侧畔千帆过,病树前头万木春。</sys:String><sys:String x:Key="story5">今日听君歌一曲,暂凭杯酒长精神。</sys:String>
</ResourceDictionary>

在对应窗口中,包含资源文件的路径即可,如下所示:

<Window x:Class="WpfApp1.TwelveWindow"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:WpfApp1"mc:Ignorable="d"Title="资源字典示例" Height="350" Width="400"><Window.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="OneDictionary.xaml"></ResourceDictionary></ResourceDictionary.MergedDictionaries></ResourceDictionary></Window.Resources><StackPanel Margin="5" HorizontalAlignment="Center"><TextBlock x:Name="tbStory0" Margin="5" Padding="5" FontSize="20"  Text="{StaticResource story0}"></TextBlock><TextBlock x:Name="tbStory1" Margin="5" Padding="5" FontSize="20"  Text="{StaticResource story1}"></TextBlock><TextBlock x:Name="tbStory2" Margin="5" Padding="5" FontSize="20"  Text="{StaticResource story2}"></TextBlock><TextBlock x:Name="tbStory3" Margin="5" Padding="5" FontSize="20"  Text="{StaticResource story3}"></TextBlock><TextBlock x:Name="tbStory4" Margin="5" Padding="5" FontSize="20"  Text="{StaticResource story4}"></TextBlock><TextBlock x:Name="tbStory5" Margin="5" Padding="5" FontSize="20"  Text="{StaticResource story5}"></TextBlock></StackPanel>
</Window>

示例截图如下:

图片

以上就是【浅谈WPF之样式与资源】的全部内容,关于更多详细内容,可参考官方文档。希望能够一起学习,共同进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/650178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s-基础知识(Service,NodePort,CusterIP,无头服务,NameSpace,资源限制)

Node Node 是 Pod 真正运行的主机&#xff0c;可以是物理机&#xff0c;也可以是虚拟机。 Annotations 原文链接 Annotations 是 key/value 形式附加于对象的注解。不同于 Labels 用于标志和选择对象&#xff0c;Annotations 则是用来记录一些附加信息&#xff0c;用来辅助应…

x-cmd pkg | httpx - 为 Python 设计的下一代 HTTP 客户端库

目录 简介首次用户功能特点进一步探索 简介 HTTPX 是一个为 Python 设计的下一代 HTTP 客户端库&#xff0c;由 Tom Christie 创建。它提供了同步和异步的 API&#xff0c;并支持 HTTP/1.1 和 HTTP/2 协议。与 Requests 库类似&#xff0c;但增加了对异步请求的支持和 HTTP/2 …

MySql8的简单使用(1.模糊查询 2.group by 分组 having过滤 3.JSON字段的实践)

MySql8的简单使用&#xff08;1.模糊查询 2.group by 分组 having过滤 3.JSON字段的实践&#xff09; 一.like模糊查询、group by 分组 having 过滤 建表语句 create table student(id int PRIMARY KEY,name char(10),age int,sex char(5)); alter table student add height…

【TOP解刊】IEEE(trans)顶刊,国人绝对优势,同领域2个月录用,5天见刊!

工程技术类 • 顶刊解读 今天带来IEEE旗下工程技术领域顶刊&#xff0c;究竟这本高分期刊审稿情况如何呢&#xff1f;好投吗&#xff1f;一起来看看下文解析。如有投稿意向可重点关注&#xff0c;具体详情见下文&#xff1a; 01 期刊简介 IEEE Transactions on Power Electr…

FlashInternImage实战:使用 FlashInternImage实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

QDockWidget : 想要 top -> left -> rigt -> bottom 的布局实现

上图红圈中的实现&#xff0c;第一次想要实现&#xff0c;总会和想的不一样。 第一种情况 第二种情况 第三种情况 有时候为了达到一种效果&#xff0c;也算是煞费苦心了&#xff0c;且不说这个demo还是找的其他CSDN博主的&#xff0c;但是功夫不负有心人。 解决办法 先让 Doc…

[UI5 常用控件] 03.Icon, Avatar,Image

文章目录 前言1. Icon2. Avatar2.1 displayShape2.2 initials2.3 backgroundColor2.4 Size2.5 fallbackIcon2.6 badgeIcon2.7 badgeValueState2.8 active 3. Image 前言 本章节记录常用控件Title,Link,Label。 其路径分别是&#xff1a; sap.m.Iconsap.m.Avatarsap.m.Image 1…

01_ESP32 MicroPython开发环境搭建

一、工作原理 Python源代码->Python解释器(MicroPython)-->二进制代码(01010)-->硬件电路(ESP32)-->高低电平输出-->其他设备 二、准备工作&#xff1a; 硬件&#xff1a;ESP32开发版&#xff0c;有很多个版本可选&#xff0c;我这里用的是ESP-32开发板&…

K8s 安装部署-Master和Minion(Node)文档

K8s 安装部署-Master和Minion(Node)文档 操作系统版本&#xff1a;CentOS 7.4 Master &#xff1a;172.20.26.167 Minion-1&#xff1a;172.20.26.198 Minion-2&#xff1a;172.20.26.210&#xff08;后增加节点&#xff09; ETCD&#xff1a;172.20.27.218 先安装部署ETC…

navicat 可以直接往 mysql导入excel表格

妈呀 还好 提前问了一下&#xff0c;不然哼哧哼哧在那里写&#xff0c;导入接口。。

05-TiDB 之 HTAP 快速上手

混合型在线事务与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 功能 HTAP 存储引擎&#xff1a;行存 与列存 同时存在&#xff0c;自动同步&#xff0c;保持强一致性。行存 OLTP &#xff0c;列存 OLAPHTAP 数据一致性&#xff1a;作为一个分布式事务…

【王道数据结构】【chapter2线性表】【P43t15】

单链表有环&#xff0c;是指单链表的最后一个节点的指针指向了链表中的某个结点&#xff08;通常单链表的最后一个节点的指针域是空的&#xff09;。试编写算法判断单链表是否存在环。 #include <iostream>typedef struct node{int data;node* next; }node,*list;list I…

递归方法猴子吃桃问题

public class A {public static void main(String[] args) {System.out.println("第一天有&#xff1a;"f(1)"个");System.out.println("第二天有&#xff1a;"f(2)"个");System.out.println(".....");System.out.println(&…

代码随想录算法训练营第32天(贪心算法02● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

贪心算法 part02 122.买卖股票的最佳时机II解题思路 55. 跳跃游戏解题思路 45.跳跃游戏II &#xff08;来不及了 明天刷解题思路 122.买卖股票的最佳时机II 动态规划章节会重点讲买卖股票问题 本题解法很巧妙&#xff0c;大家可以看题思考一下&#xff0c;在看题解。 题目链接&…

C语言之指针的地址和指向的内容总结(八十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

前端工程化之:CSS工程化+Less

一、什么是Less&#xff1f; Less官网 Less中文网 Less 是一种更加简洁的样式代码&#xff0c;它非常像 CSS &#xff0c;但又不太一样&#xff0c;它让编写样式变得更容易。 Less 代码虽好&#xff0c;但它无法被浏览器识别&#xff0c;因此需要一个工具将其转换为纯正的 CS…

Christmas Trees(ACabc334-b)

总结&#xff1a;遇到与X轴相关问题考虑三种情况&#xff1a;都是正的&#xff0c;都是负的&#xff0c;一正一负&#xff08;这种情况下比前两者多了一个0&#xff09;。

单片机设计_智能蓝牙电子秤(51单片机、HX711AD)

想要更多项目私wo!!! 一、电路设计 智能蓝牙电子称由51单片机、HX711AD称重模块、HC-05蓝牙模块、LCD1602等电路组成硬件部分,然后上传至APP。 二、运行结果 三、部分代码 #include "main.h" #include "HX711.h" #include "uart.h" #include …

【QT+QGIS跨平台编译】之十一:【libzip+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、libzip介绍二、文件下载三、文件分析四、pro文件五、编译实践一、libzip介绍 libzip是一个开源C库,用于读取,创建和修改zip文件。 libzip可以从数据缓冲区,文件或直接从其他zip归档文件直接复制的压缩数据中添加文件。在不关闭存档的情况下所做的更改可以还原…

Redis客户端之Jedis(一)介绍

目录 一、Jedis介绍&#xff1a; 1、背景&#xff1a; 2、Jedis连接池介绍&#xff1a; 二、Jedis API&#xff1a; 1、连接池API 2、其他常用API&#xff1a; 三、SpringBoot集成Jedis&#xff1a; 1、Redis集群模式&#xff1a; &#xff08;1&#xff09;配置文件…