【发布时间】: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