Naylor 发表于 2022-12-12 17:28

WPF中的“资源”

本帖最后由 Naylor 于 2022-12-12 17:30 编辑

# WPF中的“资源”
## 资源概述
WPF中的资源的概念有点类似 web 技术中的静态资源的概念。可以是一个样式,也可以是一个button的边框设置集合。
可以简单的将资源分为如下几个类别:
* 窗体资源:顾名思义,仅可在当前窗体中使用
* 全局资源:相对于窗体资源而言,是一个全局级别的,可以被多个窗体引用,可以根据不同的维度定义多个全局资源文件
* 动态资源:“值”可以被改变的资源,例如:程序启动的时候button的边框是红色的,当点击某个其他按钮后,将边框变成蓝色
## 窗体资源
### 创建
~~~
<Window.Resources>
      <SolidColorBrush x:Key="SolidColor"Color="Red">
      </SolidColorBrush>
    </Window.Resources>
~~~
### 引用
使用花括号和关键字 StaticResource
~~~
<StackPanel>
      <Button Content="我是一个按钮" Margin="10"BorderBrush="{StaticResourceSolidColor}"></Button>
</StackPanel>
~~~
## 全局资源
### 创建 资源字典 文件
右键工程,点击添加-资源字典,命名为DictionaryButton.xaml
### 编写全局资源
~~~
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <SolidColorBrush x:Key="GlobalSolidColor" Color="Yellow"></SolidColorBrush>
    <Style x:Key="DefaultButtonStyle" TargetType="Button">
      <Setter   Property="Foreground"Value="Blue"></Setter>
      <Setter   Property="FontSize"Value="20"></Setter>
      <SetterProperty="BorderBrush" Value="Pink" ></Setter>
      <Setter   Property="BorderThickness"Value="10"></Setter>
    </Style>
</ResourceDictionary>
~~~
### 引入
在 App.xaml 文件中引入全局资源文件 DictionaryButton.xaml
~~~
    <Application.Resources>
      <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="DictionaryButton.xaml"></ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary>
    </Application.Resources>
~~~
### 引用
~~~
   <StackPanel>
      <Button Content="我是一个按钮" Margin="10"   Style="{StaticResource DefaultButtonStyle}"></Button>
   </StackPanel>
~~~
## 动态资源
就资源本身而言,动态资源并没有什么特殊之处,仅仅是在处理方式上面的差异。

### 创建
参考 窗体资源
### 引用
~~~
                <StackPanel>
                  <Button Content="改变下面控件的边框颜色" Margin="10"Click="Button_Click" ></Button>
                  <Button Content="我是一个按钮" Margin="10"BorderBrush="{DynamicResourceSolidColor}" BorderThickness="10"></Button>
                </StackPanel>
~~~
### 动态编辑资源
~~~
   private void Button_Click(object sender, RoutedEventArgs e)
      {
            this.Resources["SolidColor"] = new SolidColorBrush(Colors.Blue);
      }
~~~
## 代码
https://github.com/Naylor55/WPF-Taste/tree/main/resource/ResourceTaste

Naylor 发表于 2023-4-3 09:31

wincao 发表于 2023-3-30 18:16
能写代码出来吗?谢谢

<Window x:Class="RambleWPF.资源2"
      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:RambleWPF"
      mc:Ignorable="d"
      Title="资源2" Height="450" Width="800">
    <Window.Resources>

      <Style x:Key="borStyle" TargetType="Border">
            <Setter Property="BorderThickness" Value="20"></Setter>
      </Style>
    </Window.Resources>
    <Grid>
      <Border Width="300" BorderBrush="Pink" Height="400" Style="{StaticResource borStyle}"></Border>
    </Grid>
</Window>




http://img.anlu58.com/Default/6666666666.png

wincao 发表于 2023-3-28 11:38

请问有什么方便的办法,确定“ <SolidColorBrush x:Key="SolidColor"Color="Red" />”这些关键词?

比如说,我想将BorderThickness=“10”改写为窗体资源。
创建:<Border x:Key="BorderThick" BorderThickness="10" />
引用:BorderThickness="{StaticResource =BorderThick}"

错误:        XDG-0001        资源“BorderThick”具有不兼容的类型。       

家里有个肉团纸 发表于 2022-12-12 20:45

对于初学者还是有看看的意义的

17601278886 发表于 2022-12-12 21:00

看完了,觉得受益匪浅

ming11421 发表于 2022-12-12 22:15

学习中!果然有用!

WrmQ 发表于 2023-3-28 12:41

对小白果然有用!

Naylor 发表于 2023-3-30 17:59

wincao 发表于 2023-3-28 11:38
请问有什么方便的办法,确定“ ”这些关键词?

比如说,我想将BorderThickness=“10”改写为窗体资源。
...

你可以将BorderThickness定义为一个“资源”, 然后引用此资源;或者你可以写一个style , 然后再引用这个style

wincao 发表于 2023-3-30 18:16

Naylor 发表于 2023-3-30 17:59
你可以将BorderThickness定义为一个“资源”, 然后引用此资源;或者你可以写一个style , 然后再引 ...

能写代码出来吗?谢谢

Naylor 发表于 2023-4-3 09:32

wincao 发表于 2023-3-30 18:16
能写代码出来吗?谢谢

欢迎你的评论, 代码示例在下面,希望可以帮到你
页: [1] 2
查看完整版本: WPF中的“资源”