原文:WPF 绑定StaticResource到控件的方法

资源文件内的属性能否直接通过绑定应用到控件?答案是肯定的。

比如,我们要直接把下面的<SolidColorBrush x:Key="RedBrush" Color="#FFFF0000" />直接绑定到一个TextBlock的Foreground属性。

<Application x:Class="StaticResourcesWithBinding.App"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    StartupUri="Window1.xaml">

    <Application.Resources>
<SolidColorBrush x:Key="RedBrush" Color="#FFFF0000" />

    </Application.Resources>

</Application>

办法是直接把资源文件内的Key的名字绑定到控件,

public class MyViewModel
{
public string MyResourceKey { get; private set; }
public MyViewModel(string myResourceKey)
{
MyResourceKey = myResourceKey;
}
}

直接绑定可以吗?

<Window x:Class="StaticResourcesWithBinding.Window1"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

   Title="Window1" Width="400" Height="200">
<Grid>
<TextBlock Text="Hello World" FontSize="48" Foreground="{StaticResource  {Binding MyResourceKey}}" />
</Grid>

</Window>

但这样是行不通的。

必须要用下面的类进行转换

using System;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup; namespace StaticResourcesWithBinding
{
public class BindableStaticResource : StaticResourceExtension
{
private static readonly DependencyProperty DummyProperty; static BindableStaticResource()
{
DummyProperty = DependencyProperty.RegisterAttached("Dummy",
typeof(Object),
typeof(DependencyObject),
new UIPropertyMetadata(null));
} public Binding MyBinding { get; set; } public BindableStaticResource()
{
} public BindableStaticResource(Binding binding)
{
MyBinding = binding;
} public override object ProvideValue(IServiceProvider serviceProvider)
{
var target = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
var targetObject = (FrameworkElement)target.TargetObject; MyBinding.Source = targetObject.DataContext;
var DummyDO = new DependencyObject();
BindingOperations.SetBinding(DummyDO, DummyProperty, MyBinding); ResourceKey = DummyDO.GetValue(DummyProperty); return ResourceKey != null ? base.ProvideValue(serviceProvider) : null;
}
public new object ResourceKey
{
get
{
return base.ResourceKey;
}
set
{
if (value != null)
{
base.ResourceKey = value;
}
}
}
}
}

然后,我们就可以通过以下方式绑定了:

<Window x:Class="StaticResourcesWithBinding.Window1"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:StaticResourcesWithBinding="clr-namespace:StaticResourcesWithBinding"

    Title="Window1" Width="400" Height="200">
<Grid>
<TextBlock Text="Hello World" FontSize="48" Foreground="{StaticResourcesWithBinding:BindableStaticResource {Binding MyResourceKey}}" />
</Grid>

</Window>

后面的代码:

public partial class Window1
{
public Window1()
{

            this.DataContext = new MyViewModel("RedBrush");
InitializeComponent();

            
}
}

本文完整源码下载

WPF 绑定StaticResource到控件的方法的更多相关文章

  1. [转]在WPF中使用WinForm控件方法

    本文转自:http://blog.csdn.net/lianchangshuai/article/details/6415241 下面以在Wpf中添加ZedGraph(用于创建任意数据的二维线型.条型 ...

  2. WPF中TreeView控件SelectedItemChanged方法的MVVM绑定

    问题描述:左侧treeview控件中点击不同类别的节点时,右侧的页面会显示不同的权限.比如对于My Publications,拥有Modify和Delete两种权限,对于My Subscription ...

  3. CYQ.Data 支持WPF相关的数据控件绑定(2013-08-09)

    事件的结果 经过多天的思考及忙碌的开发及测试,CYQ.Data 终于在UI上全面支持WPF,至此,CYQ.Data 已经可以方便支持wpf的开发,同时,框架仍保留最低.net framework2.0 ...

  4. CYQ.Data 支持WPF相关的数据控件绑定.Net获取iis版本

    CYQ.Data 支持WPF相关的数据控件绑定(2013-08-09) 事件的结果 经过多天的思考及忙碌的开发及测试,CYQ.Data 终于在UI上全面支持WPF,至此,CYQ.Data 已经可以方便 ...

  5. 如何在双向绑定的Image控件上绘制自定义标记(wpf)

    我们的需求是什么? 答:需要在图片上增加一些自定义标记,例如:2个图片对比时,对相同区域进行高亮. 先上效果图: 设计思路 1.概述 1.通过TargeUpdated事件,重新绘制图片进行替换. 2. ...

  6. 封装:WPF中可以绑定的BindPassWord控件

    原文:封装:WPF中可以绑定的BindPassWord控件 一.目的:本身自带的PassWord不支持绑定 二.Xaml部分 <UserControl x:Class="HeBianG ...

  7. WPF 将数据源绑定到TreeView控件出现界面卡死的情况

    首先来谈一下实现将自定义的类TreeMode绑定到TreeView控件上的一个基本的思路,由于每一个节点都要包含很多自定义的一些属性信息,因此我们需要将该类TreeMode进行封装,TreeView的 ...

  8. WPF编程,将控件所呈现的内容保存成图像的一种方法。

    原文:WPF编程,将控件所呈现的内容保存成图像的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/detai ...

  9. WPF利用通过父控件属性来获得绑定数据源RelativeSource

    WPF利用通过父控件属性来获得绑定数据源RelativeSource   有时候我们不确定作为数据源的对象叫什么名字,但知道作为绑定源与UI布局有相对的关系,如下是一段XAML代码,说明多层布局控件中 ...

随机推荐

  1. scrapy简单入门及选择器(xpath\css)

    简介 scrapy被认为是比较简单的爬虫框架,资料比较齐全,网上也有很多教程.官网上介绍了它的四种安装方法,PyPI.Conda.APT.Source,我们只介绍最简单的安装方法. 安装 Window ...

  2. [微信] 客服接口调用的时候返回 40003 Invalid OpenID

    首先确认收件人在24小时内主动向公众号发过消息.该消息的 FromUserId 即是客服消息的 touser 参数的 OpenId 2017-05-19 更新:可以使用UTF-8了 string ur ...

  3. C# Redis的操作

    Nuget添加StackExchange.Redis的引用 由于Redis封装类同时使用了Json,需要添加JSON.NET引用(Newtonsoft.Json) Redis封装类 /// <s ...

  4. 通过runtime打印出对象所有属性的值

    通过runtime打印出对象所有属性的值 今天给给大家提供的关于NSObject的category,通过runtime打印属性的值,相当有用哦,以后你再也不用每个对象都通过NSLog来逐个打印属性值了 ...

  5. 铁乐学Python_day03-字符串常用操作方法

    文:铁乐与猫 2018-3-20 1)字符串首个字母大写,其它字母也会转换成小写: S.capitalize() -> str 记忆方法:capital(大写字母) def capitalize ...

  6. swift的enum基础

    其它语言的枚举: 符号化的整型常量的集合: swift的枚举: 可以是任何基础类型和无类型: If you are familiar with C, you will know that C enum ...

  7. leetcode第一刷_N-Queens

    八皇后问题应该是回溯法的教学典范.在本科的时候,有一门课叫面向对象.最后的附录有这个问题的源码.当时根本不懂编程,照抄下来,执行一下出了结果都非常开心,哎. 皇后们的限制条件是不能同行同列,也不能同对 ...

  8. input框动态模糊查询,能输入,能选择

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Day7 Tomcat和servlet

    web服务器 1)        什么是web服务器 硬件:性能强大的计算机(无显示屏) 操作系统: linux 软件:web服务器软件(将数据放置在服务器上就可以被外部访问) web应用程序 2)  ...

  10. jenkins 基本插件