WPF 入门教程Resources使用方法

92 篇文章 9 订阅
92 篇文章 23 订阅

WPF 引入了一个非常方便的概念:将数据存储为资源,可以在本地用于控件,在本地用于整个窗口,也可以用于整个应用程序的全局。数据几乎可以是您想要的任何内容,从实际信息到 WPF 控件的层次结构。这允许您将数据放在一个地方,然后从或其他几个地方使用它,这非常有用。

这个概念经常用于样式和模板,我们将在本教程稍后讨论,但正如本章将说明的那样,您也可以将它用于许多其他事情。一个简单的例子来演示它:

<Window x:Class="WpfTutorialSamples.WPF_Application.ResourceSample"
        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="ResourceSample" Height="150" Width="350">
    <Window.Resources>
        <sys:String x:Key="strHelloWorld">Hello, world!</sys:String>
    </Window.Resources>
    <StackPanel Margin="10">
        <TextBlock Text="{StaticResource strHelloWorld}" FontSize="56" />
        <TextBlock>Just another "<TextBlock Text="{StaticResource strHelloWorld}" />" example, but with resources!</TextBlock>
    </StackPanel>
</Window>

资源被赋予一个键,使用 x:Key 属性,它允许您通过使用此键并结合 StaticResource 标记扩展从应用程序的其他部分引用它。在这个例子中,我只存储一个简单的字符串,然后我从两个不同的 TextBlock控件中使用它。

静态资源与动态资源

在到目前为止的示例中,我使用了 StaticResource 标记扩展来引用资源。但是,存在一种替代方案,以 DynamicResource 的形式存在。

主要区别在于静态资源仅在加载 XAML 时解析一次。如果随后更改了资源,则此更改将不会反映在您使用 StaticResource 的位置。

另一方面,动态资源会在实际需要时解析,如果资源发生变化,则会再次解析。将其视为绑定到静态值与绑定到监视此值并在每次更改时将其发送给您的函数的绑定 - 这并不完全是它的工作原理,但它应该让您更好地了解何时使用什么。动态资源还允许您使用在设计时甚至不存在的资源,例如,如果您在应用程序启动期间从代码隐藏添加它们。

更多资源类型

共享一个简单的字符串很容易,但您可以做更多的事情。在下一个示例中,我还将存储一个完整的字符串数组,以及一个用于背景的渐变画笔。

<Window x:Class="WpfTutorialSamples.WPF_Application.ExtendedResourceSample"
        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="ExtendedResourceSample" Height="160" Width="300"
        Background="{DynamicResource WindowBackgroundBrush}">
    <Window.Resources>
        <sys:String x:Key="ComboBoxTitle">Items:</sys:String>

        <x:Array x:Key="ComboBoxItems" Type="sys:String">
            <sys:String>Item #1</sys:String>
            <sys:String>Item #2</sys:String>
            <sys:String>Item #3</sys:String>
        </x:Array>

        <LinearGradientBrush x:Key="WindowBackgroundBrush">
            <GradientStop Offset="0" Color="Silver"/>
            <GradientStop Offset="1" Color="Gray"/>
        </LinearGradientBrush>
    </Window.Resources>
    <StackPanel Margin="10">
        <Label Content="{StaticResource ComboBoxTitle}" />
        <ComboBox ItemsSource="{StaticResource ComboBoxItems}" />
    </StackPanel>
</Window>

这一次,我们添加了一些额外的资源,因此我们的 Window 现在包含一个简单的字符串、一个字符串数组和一个 LinearGradientBrush。字符串用作标签,字符串数组用作 ComboBox 控件的项目,渐变画笔用作整个窗口的背景。因此,如您所见,几乎任何东西都可以存储为资源。

本地和应用范围的资源

目前,我们将资源存储在窗口级别,这意味着您可以从整个窗口访问它们。

如果您只需要特定控件的给定资源,则可以通过将其添加到此特定控件而不是窗口来使其更加本地化。它的工作方式完全相同,唯一的区别是您现在只能从放置它的控件范围内访问:

<StackPanel Margin="10">
    <StackPanel.Resources>
        <sys:String x:Key="ComboBoxTitle">Items:</sys:String>
    </StackPanel.Resources>
    <Label Content="{StaticResource ComboBoxTitle}" />
</StackPanel>

在这种情况下,我们将资源添加到 StackPanel,然后从其子控件 Label 中使用它。StackPanel 中的其他控件也可以使用它,就像这些子控件的子控件可以访问它一样。但是,此特定 StackPanel 之外的控件将无法访问它。

如果您需要能够从多个窗口访问资源,这也是可以的。App.xaml文件可以包含资源就像窗口和任何类型的WPF控件,而当你把它们存储在App.xaml中,他们在全部范围内所有项目的窗口和用户控件的访问。它的工作方式与从 Window 存储和使用时完全相同:

<Application x:Class="WpfTutorialSamples.App"
             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"
             StartupUri="WPF application/ExtendedResourceSample.xaml">
    <Application.Resources>
        <sys:String x:Key="ComboBoxTitle">Items:</sys:String>
    </Application.Resources>
</Application>

代码隐藏的资源

到目前为止,我们已经使用标记扩展直接从 XAML 访问了我们的所有资源。但是,您当然也可以从代码隐藏访问您的资源,这在多种情况下都很有用。在前面的示例中,我们看到了如何将资源存储在多个不同的位置,因此在本示例中,我们将从代码隐藏访问三个不同的资源,每个资源存储在不同的范围内:

<Application x:Class="WpfTutorialSamples.App"
             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"
             StartupUri="WPF application/ResourcesFromCodeBehindSample.xaml">
    <Application.Resources>
        <sys:String x:Key="strApp">Hello, Application world!</sys:String>
    </Application.Resources>
</Application>

窗体:

<Window x:Class="WpfTutorialSamples.WPF_Application.ResourcesFromCodeBehindSample"
        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="ResourcesFromCodeBehindSample" Height="175" Width="250">
    <Window.Resources>
        <sys:String x:Key="strWindow">Hello, Window world!</sys:String>
    </Window.Resources>
    <DockPanel Margin="10" Name="pnlMain">
        <DockPanel.Resources>
            <sys:String x:Key="strPanel">Hello, Panel world!</sys:String>
        </DockPanel.Resources>

        <WrapPanel DockPanel.Dock="Top" HorizontalAlignment="Center" Margin="10">
            <Button Name="btnClickMe" Click="btnClickMe_Click">Click me!</Button>
        </WrapPanel>

        <ListBox Name="lbResult" />
    </DockPanel>
</Window>

代码隐藏:

using System;
using System.Windows;

namespace WpfTutorialSamples.WPF_Application
{
	public partial class ResourcesFromCodeBehindSample : Window
	{
		public ResourcesFromCodeBehindSample()
		{
			InitializeComponent();
		}

		private void btnClickMe_Click(object sender, RoutedEventArgs e)
		{
			lbResult.Items.Add(pnlMain.FindResource("strPanel").ToString());
			lbResult.Items.Add(this.FindResource("strWindow").ToString());
			lbResult.Items.Add(Application.Current.FindResource("strApp").ToString());
		}
	}
}

因此,我们存储了三个不同的“Hello, world!” 消息:一个在 App.xaml 中,一个在窗口内,一个在本地用于主面板。该界面由一个按钮和一个列表框组成。

在代码隐藏中,我们处理按钮的单击事件,在该事件中我们将每个文本字符串添加到 ListBox,如屏幕截图所示。我们使用 FindResource()方法,该方法将资源作为对象(如果找到)返回,然后我们使用 ToString() 方法将其转换为我们知道的字符串。

请注意我们如何在不同范围内使用 FindResource() 方法 - 首先在面板上,然后在窗口上,然后在当前 应用程序对象上。在我们知道的地方寻找资源是有意义的,但正如已经提到的,如果没有找到资源,搜索会在层次结构中向上进行,所以原则上,我们可以在面板上使用 FindResource() 方法所有三种情况,因为它会一直持续到窗口,然后再到应用程序级别,如果没有找到。

反过来就不一样了 - 搜索不会向下导航树,因此您无法在应用程序级别开始查找资源,如果它已在本地为控件或窗口定义。

 推荐一款WPF MVVM框架开源项目:Newbeecoder.UI

Newbeecoder.UI开源项目

Demo下载:

Newbeecoder.UI开源项目icon-default.png?t=M3K6https://share.weiyun.com/py6W1dcK

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF(Windows Presentation Foundation)是一种用于创建用户界面的技术,它是微软公司在.NET Framework 3.0中引入的。WPF使用XAML语言来定义用户界面,提供了丰富的可视化效果和交互能力。初学者可以通过学习WPF入门教程PDF来快速上手这一技术。 WPF入门教程PDF通常包含以下内容: 1. WPF概述:介绍WPF的特点、优势以及其与传统WinForms技术的对比,帮助初学者了解WPF的基本概念和原理。 2. XAML语法介绍:详细解释XAML语言的语法规则和常用的标记元素,以及如何使用XAML定义用户界面的外观和行为。 3. 基本控件:讲解WPF中常用的基本控件,如按钮、文本框、标签等,以及它们的属性和事件,帮助初学者了解如何创建和操作这些控件。 4. 布局和容器:介绍WPF中的布局和容器控件,如Grid、StackPanel、Canvas等,帮助初学者了解如何将控件放置在窗口中的不同位置和方式。 5. 数据绑定:说明WPF中的数据绑定机制,以及如何将数据源与用户界面进行绑定,实现数据的显示和交互。 6. 动画和效果:介绍WPF中的动画和效果功能,帮助初学者了解如何为用户界面添加动态和吸引人的效果。 通过学习WPF入门教程PDF,初学者可以快速理解WPF的基本原理和使用方法,掌握WPF开发所需要的基本知识和技能。同时,还可以通过实践和进一步学习,不断提升自己在WPF技术方面的能力,实现更加复杂和出色的用户界面设计与开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值