博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF 绑定StaticResource到控件的方法
阅读量:5127 次
发布时间:2019-06-13

本文共 3153 字,大约阅读时间需要 10 分钟。

原文:

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

比如,我们要直接把下面的<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();
            
}
}

本文完整源码

posted on
2019-04-15 16:54 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/lonelyxmas/p/10711565.html

你可能感兴趣的文章
timeline时间轴进度“群英荟萃”
查看>>
python if else elif statement
查看>>
网络编程
查看>>
文本隐藏(图片代替文字)
查看>>
java面试题
查看>>
提高码力专题(未完待续)
查看>>
pair的例子
查看>>
前端框架性能对比
查看>>
uva 387 A Puzzling Problem (回溯)
查看>>
12.2日常
查看>>
同步代码时忽略maven项目 target目录
查看>>
Oracle中包的创建
查看>>
团队开发之个人博客八(4月27)
查看>>
发布功能完成
查看>>
【原】小程序常见问题整理
查看>>
C# ITextSharp pdf 自动打印
查看>>
【Java】synchronized与lock的区别
查看>>
django高级应用(分页功能)
查看>>
【转】Linux之printf命令
查看>>
关于PHP会话:session和cookie
查看>>