WPF整理-使用逻辑资源
"Traditional application resources consist of binary chunks of data, typically representing things such as icons, bitmaps, strings, and XML. In fact, the .NET framework provides
generic support for these through the ResourceManager class.
WPF is no different—binary resources play an important role in a typical application.
However, WPF goes a lot further with another kind of resource: logical resources.
These are objects, any objects, which can be shared and used in a multitude of locations
throughout the application; they can even be accessed across assemblies. Some
of WPF's features, such as implicit (automatic) styles and type-based data templates,
rely on the logical resources system."
傳統(tǒng)的資源一般是指大塊的二進(jìn)制資源,典型的如圖片、xml文件等,.NET提供了ResourceManager類來管理這些資源。而WPF引進(jìn)了另一種形式的資源-logical resources(邏輯資源),它可以是任何需要共享的對(duì)象。WPF的許多特性也都依賴邏輯資源系統(tǒng)。
“These objects are typically placed inside a
ResourceDictionary and located at runtime using a hierarchical search.”
下面通過一個(gè)例子,說明為什么需要logical resource、如何在XAML中及Code behind file中訪問logical resource。
1.為什么需要Logical Resource?
假如我們需要為一個(gè)rectangle的Fill屬性賦一個(gè)LinearGradientBrush值。通常實(shí)現(xiàn)如下:
<Rectangle Height="100" Stroke="Red"><Rectangle.Fill><LinearGradientBrush ><GradientStop Offset="0.3" Color="Green"/><GradientStop Offset="0.8" Color="Brown"/></LinearGradientBrush></Rectangle.Fill></Rectangle>假如,現(xiàn)在我們另外還有1個(gè)Rectangle需要同樣的Brush,當(dāng)然我們可以Copy上面的<Rectangle.Fill>...</Rectangle.Fill>,這樣可以滿足需求,但是這樣的Copy很讓人頭疼。
Logical resource能夠解決這個(gè)問題。
2.定義logical resource
我們可以把上面的Brush放到Window.Resources中,如下:
<Window.Resources><LinearGradientBrush x:Key="brush1"><GradientStop Offset="0.3" Color="Green"/><GradientStop Offset="0.8" Color="Yellow"/></LinearGradientBrush> </Window.Resources>注意以下2點(diǎn):
a.“Every element (deriving from FrameworkElement) has a Resources property of type
ResourceDictionary. This means that every element can have resources associated with
it.”
每個(gè)element都有Resources屬性。
b.“The Resources property is a dictionary.In XAML, the x:Key attribute must be specified (most of the time; exceptions to this rule
will be discussed in relation to styles and data templates).”
在XAML中x:key必須聲明,style和data templates有些例外(x:Type)。
3.在XAML中使用
添加完成后,我們可以在XAML中通過StaticResource(后面介紹DynamicResource)這個(gè)markup extension,很方便的使用這個(gè)logical resource
<Rectangle Height="100" Fill="{StaticResource brush1}"/>4.在Code Behind File中使用
如為下面的Ellipse賦Fill值
<Ellipse x:Name="ellipse2" Stroke="Red" StrokeThickness="20" Height="100" />我們有兩種方法獲取這個(gè)Resource。
?方法a:通過FrameworkElement.FindResource?,此方法在找不到的時(shí)候放回null,因此最好加個(gè)null判斷。
Brush brush1 = (Brush)ellipse2.FindResource("brush1"); if (brush1 != null) {ellipse2.Fill = brush1; }?方法b.是資源可以通過它的索引直接獲得。由于我們知道定義資源的是哪個(gè)element,我們可以直接使用element.Resources["name"]獲得。本例定義的是Window的資源,因此是:
Brush brush = (Brush)this.Resources["brush1"];?5.Logical Resource是如何匹配的?
?如上面的
<Rectangle Height="100" Fill="{StaticResource brush1}"/>?“This causes a search from the current element (the Rectangle) up the element tree, looking
for a resource with the key brush1; if found, its associated object is used as the property's
value. If not found on any element up to the root Window, the search continues within the
resources of Application (typically located in the App.xaml file). If not found even there,
a runtime exception is thrown. This is depicted in the following diagram:”
附:完整的XAML和Code Behind File如下:
<Window x:Class="UsingLogicalResources.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><LinearGradientBrush x:Key="brush1"><GradientStop Offset="0.3" Color="Green"/><GradientStop Offset="0.8" Color="Yellow"/></LinearGradientBrush> </Window.Resources><StackPanel><Rectangle Height="100" Stroke="Red"><Rectangle.Fill><LinearGradientBrush ><GradientStop Offset="0.3" Color="Green"/><GradientStop Offset="0.8" Color="Brown"/></LinearGradientBrush></Rectangle.Fill></Rectangle><Ellipse x:Name="ellipse2" Stroke="Red" StrokeThickness="20" Height="100" /><Rectangle Height="100" Fill="{StaticResource brush1}"/></StackPanel> </Window> View Code using System; using System.Collections.Generic; 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 UsingLogicalResources {/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();//Brush brush1=(Brush)this.Resources["brush1"];Brush brush1 = (Brush)ellipse2.FindResource("brush1");if (brush1 != null){ellipse2.Fill = brush1;}}} } View Code運(yùn)行,如下:
?
?
posted on 2018-05-29 00:48 NET未來之路 閱讀(...) 評(píng)論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/lonelyxmas/p/9103102.html
總結(jié)
以上是生活随笔為你收集整理的WPF整理-使用逻辑资源的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sqlalchemy如何实现时间列自动更
- 下一篇: jira webhook 事件触发并程序