【问题标题】:WPF - How to bind to a color in resources with Caliburn.MicroWPF - 如何使用 Caliburn.Micro 绑定到资源中的颜色
【发布时间】:2012-11-26 16:00:41
【问题描述】:

如何使用 Caliburn Micro 将 <Color x:Key="SomeColor" /> 之类的内容绑定到依赖属性?

我需要能够在运行时更改 Color 并在所有使用它的东西中立即更新它。

解决方案:


SomeClassView.xaml 中的 XAML

<SomeControl.Resources>
    <SolidColorBrush x:Key="ControlBrush" />
</SomeControl.Resources>

SomeClassViewModel.cs 中的 C#

[Export(typeof(MainWindowViewModel))]
public class MainWindowViewModel : PropertyChangedBase
{
    private SolidColorBrush _controlBrush;

    public SolidColorBrush ControlBrush
    {
        get { return _controlBrush; }
        set
        {
            _controlBrush = value;
            NotifyOfPropertyChange(() => ControlBrush);
        }
    }
}

问题正是 Charleh 所说的,我只是完全忘记了 WPF 中并非所有内容都可以是 DependencyProperty。

【问题讨论】:

    标签: wpf data-binding dependency-properties caliburn.micro


    【解决方案1】:

    您通常不能直接绑定 Color 对象,您需要使用 SolidColorBrush(用于纯色),因为这是大多数 UI 对象所期望的。

    例如

    TextBox.Background 期望 Brush,其中 SolidColorBrush 是其子类。还有其他类型的画笔可以产生不同的填充,例如LinearGradientBrush

    看看这里:

    How can I bind a background color in WPF/XAML?

    您能否提供一些您所期望的和 XAML 的屏幕截图?

    编辑:

    好吧,你想要的很容易实现,与 Caliburn.Micro 完全无关 :)

    像往常一样创建您的样式,但使用DynamicResource 动态绑定画笔Color 属性。当您更新颜色本身时,将再次评估资源绑定并更改颜色。

    XAML 示例:

    <Window x:Class="WpfApplication1.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>
            <Color x:Key="TestColor" A="255" R="255" G="0" B="0"></Color>
            <Style x:Key="ButtonStyle" TargetType="Button">
                <Setter Property="Background">
                    <Setter.Value>
                        <SolidColorBrush Color="{DynamicResource TestColor}"></SolidColorBrush>
                    </Setter.Value>
                </Setter>
            </Style>
        </Window.Resources>
        <Grid>
            <StackPanel>
                <Button Click="Button_Click" Style="{StaticResource ButtonStyle}">Red</Button>
                <Button Click="Button_Click_1" Style="{StaticResource ButtonStyle}">Blue</Button>
            </StackPanel>
        </Grid>
    </Window>
    

    代码隐藏:

    namespace WpfApplication1
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                Resources["TestColor"] = Color.FromArgb(255, 255, 0, 0);
            }
    
            private void Button_Click_1(object sender, RoutedEventArgs e)
            {
                Resources["TestColor"] = Color.FromArgb(255, 0, 0, 255);
            }
        }
    }
    

    【讨论】:

    • 我认为没有必要举例,我相信一旦你听到它的用途你就会知道。基本上我会为所有控件设置一组样式,这些样式只会在它们使用的几种颜色上有所不同。相反,我想做的是拥有单一样式并动态更改它使用的一些颜色。所以我认为最好的办法是,如果我可以将 Color 对象从资源自动绑定到依赖属性,这样当我在代码中(或通过双向绑定)更改它时它会得到更新,并且样式会自动也得到更新。
    • 已编辑以包含一个适合您的答案 - 如果这不是您想要的,请告诉我
    • 哈哈,我看到我们都走了不同的路。我会研究你的代码,看看你是怎么做的。
    • 几乎相同的事情 - 你是如何获得 VM 中的资源的,因为 CM 不鼓励直接从 VM 操作视图
    • 您所看到的正是我正在使用的。 CM 将命名资源绑定到我随后更改的依赖属性。我在这里做错了什么,你会如何改变它?
    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    相关资源
    最近更新 更多