【问题标题】:Binding two colour on a wpf template在 wpf 模板上绑定两种颜色
【发布时间】:2013-04-11 09:23:43
【问题描述】:

我创建了一个模板,以便为我的应用程序设置一个主题。 在这个模板中,我创建了一个渐变样式(由两种颜色组成):

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
   <LinearGradientBrush x:Key="DegradeCouleurTheme" StartPoint="0,0" EndPoint="0,1">
       <!--<GradientStop Offset="0" Color="#00b6e7"/>
       <GradientStop Offset="1" Color="#0086d6"/>-->
       <GradientStop Offset="0" Color="{Binding Path=(m_ThemeColorGradientBegin)}"/>
       <GradientStop Offset="1" Color="{Binding Path=(m_ThemeColorGradientEnd)}"/>
   </LinearGradientBrush>
</ResourceDictionary>

我希望能够更改这两种颜色,所以我创建了一个窗口来设置颜色。这些颜色存储在“CParametres.cs”类中。这两种颜色接下来存储在数据库中。

这是我的 CParameters 类:(我清理了类以获得更好的视图)

namespace Phoenix_CRM
{
    public class CParametres : INotifyPropertyChanged
    {
        private Color m_ThemeColorGradientBegin;
        public Color ThemeColorGradientBegin
        {
            get { return m_ThemeColorGradientBegin; }
            set
            {
                m_ThemeColorGradientBegin = value;
                FirePropertyChangedEvent("ThemeColorGradientBegin");
            }
        }

        private Color m_ThemeColorGradientEnd;
        public Color ThemeColorGradientEnd
        {
            get { return m_ThemeColorGradientEnd; }
            set
            {
                m_ThemeColorGradientEnd = value;
                FirePropertyChangedEvent("ThemeColorGradientEnd");
            }
        }


        public CParametres(r)
        {
           ......
        }

        public void LoadParams()
        {
            if (ReadParamFromDB() == true)
            {
                setThemeGradient(m_ThemeColorGradientBegin, m_ThemeColorGradientEnd);
            }
        }    

        public void setThemeGradient(Color ColorBegin, Color ColorEnd)
        {
            ThemeColorGradientBegin = ColorBegin;
            ThemeColorGradientEnd = ColorEnd;
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void FirePropertyChangedEvent(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

在我的 App.xaml.cs 中,我创建了一个对象“CParametres”,并从该对象的数据库中加载颜色:

在我的 App.xamls.cs 中

obj_Parametres = new CParametres()
obj_Parametres .LoadParams()

在这个 LoadParams() 之后,两种颜色存储在:

m_ThemeColorGradientBegin 和 m_ThemeColorGradientEnd 对象。

我正在尝试将这两种颜色绑定到我的模板,并且当我运行我的应用程序时,我没有任何崩溃,但颜色不适用。

我调试我的应用程序,LoadParams 函数没问题,我的 m_ThemeColorGradientBegin 和 m_ThemeColorGradientEnd 对象包含颜色。

谁能解释我为什么我的绑定不正确?

非常感谢:)

最好的问候,

尼克斯

--EDIT-- MoHaKa 提示后:

模板:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:ns="clr-namespace:Phoenix_CRM">


  <LinearGradientBrush x:Key="DegradeCouleurTheme" StartPoint="0,0" EndPoint="0,1">
      <!--<GradientStop Offset="0" Color="#00b6e7"/>
      <GradientStop Offset="1" Color="#0086d6"/>-->
      <GradientStop Offset="0" Color="{x:Static ns:CParametres.ThemeColorGradientBegin}"/>
      <GradientStop Offset="1" Color="{x:Static ns:CParametres.ThemeColorGradientBegin}"/>
  </LinearGradientBrush>
</ResourceDictionary>

我的 CParametres.CS:

    private static Color m_ThemeColorGradientBegin;
    public static Color ThemeColorGradientBegin
    {
        get { return m_ThemeColorGradientBegin; }
        set
        {
            m_ThemeColorGradientBegin = value;
            FirePropertyChangedEvent("ThemeColorGradientBegin");
        }
    }

将静态设置为 ThemeColorGradientBegin 和 m_ThemeColorGradientBegin 我在 FirePropertyChangedEvent() 上有一个编译器错误:错误 MC3011:无法在 CParametres 类型上找到静态成员 ThemeColorGradientBegin。

请问你有什么想法吗?

谢谢:)

【问题讨论】:

  • 我可以解释为什么它不起作用。您的 Gradient 使用 WPF 以任何方式都不知道的路径。似乎您想访问您在某处实例化的类中的两个私有字段。这个梯度怎么知道这个实例在哪里?此外,WPF 绑定永远不会在私有字段上工作,总是在公共属性上工作。除此之外,MoHaKas 的答案是一个很好的解决方案。
  • 你已经拥有properties - 为什么不使用它们,ThemeColorGradientBegin 等等。
  • 您好,我尝试了 Mohoko 的技巧,但我有一点错误,我已经在主帖中解释了。

标签: c# wpf templates binding colors


【解决方案1】:

此代码将为您提供帮助:

在你的窗口标签中定义这个语句。

xmlns:ns="clr-namespace:Phoenix_CRM"

现在使用绑定获取颜色:

<LinearGradientBrush x:Key="DegradeCouleurTheme" StartPoint="0,0" EndPoint="0,1">
    <!--<GradientStop Offset="0" Color="#00b6e7"/>
    <GradientStop Offset="1" Color="#0086d6"/>-->
    <GradientStop Offset="0" Color="{x:Static ns:CParametres.ThemeColorGradientBegin}"/>
    <GradientStop Offset="1" Color="{x:Static ns:CParametres.ThemeColorGradientEnd}"/>
</LinearGradientBrush>

别忘了把你的颜色属性改成static

【讨论】:

  • 非常感谢!所以,如果我理解,我需要将 ThemeColorGradientBegin 和 ThemeColorGradientEnd 设置为公共静态?如果我这样做,我会遇到 m_ThemeColorGradientBegin 和 m_ThemeColorGradientEnd 的问题。我在第一篇文章中添加了一个新的代码块。
  • 解决了!我已经删除了我的 CParametrs 类中的通知事件,以避免静态属性的问题!非常感谢:)
猜你喜欢
  • 2021-11-10
  • 1970-01-01
  • 2012-06-20
  • 2015-12-17
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 2023-03-14
  • 2014-06-10
相关资源
最近更新 更多