¿Cómo establecer una propiedad personalizada como valor XAML?
-
06-07-2019 - |
Pregunta
Tengo esta biblioteca con propiedades personalizadas de Color . Quiero poder usar estas propiedades en XAML así:
<Style TargetType="{x:Type eg:MyWindow}">
<Setter Property="Background">
<Setter.Value>
<SolidColorBrush Color="CustomClass.CustomColorProperty"/>
</Setter.Value>
</Setter>
</Style>
El espacio de nombres que contiene CustomClass ya está referenciado. ¿Cómo debo hacer esto? Gracias.
EDITAR:
Acabo de notar que CustomClass es estático, por lo que no puedo crear una instancia de este en XAML. Además, cuando escribo por ejemplo: , CustomClass no aparece en intellisense. No puedo lograr que ninguna de sus soluciones funcione, aunque deberían hacerlo, si tuviera una clase de instancia. ¿Hay alguna solución para esta situación?
EDITAR 2:
Esta es la clase real y el espacio de nombres:
namespace Assergs.Windows
{
public static class OfficeColors
{
public class Background
{
public static Color OfficeColor1 = (Color)ColorConverter.ConvertFromString("#e4e6e8");
public static Color OfficeColor2 = (Color)ColorConverter.ConvertFromString("#dce0ed");
public static Color OfficeColor3 = (Color)ColorConverter.ConvertFromString("#a8c3e0");
}
}
}
Y este es el espacio de nombres XAML:
xmlns:aw="clr-namespace:Assergs.Windows;assembly=Assergs.Windows"
Y si uso esta línea, como lo sugiere Zenuka:
<SolidColorBrush Color="{x:Static aw:OfficeColors.Background.OfficeColor1}"/>
Lanza este error en tiempo de compilación:
Cannot find the type 'OfficeColors.Background'. Note that type names are case sensitive.
Solución
Use esto:
<SolidColorBrush Color="{x:Static aw:OfficeColors+Background.OfficeColor1}"/>
Observe el signo + en lugar de un punto para hacer referencia a clases anidadas
Otros consejos
¿Asumo que tiene una propiedad estática en CustomClass? Entonces podrías usar:
<SolidColorBrush Color="{x:Static eg:CustomClass.CustomColorProperty}"/>
pero tal vez necesite cambiar el prefijo del espacio de nombres ...
EDITAR:
El problema radica en que estás declarando una clase en otra clase ...
Le sugiero que mueva la clase Backgroud fuera de la clase OfficeColors y la declare estática o mueva las Propiedades de la Clase de fondo a la clase OfficeColors (tal vez con un prefijo de Fondo), O use espacios de nombres como lo está intentando.
Diviértete :)
EDIT2:
Use el método de Nir usando el signo + 'aw: OfficeColors + Background.OfficeColor1' para hacer referencia a clases anidadas, no sabía cuál :)
Debería declarar una instancia de la clase como uno de los recursos. (Suponiendo que CustomColorProperty no sea estático)
<CustomNamespace.CustomClass x:Key=CcInstance />
<Style TargetType="{x:Type eg:MyWindow}">
<Setter Property="Background">
<Setter.Value>
<SolidColorBrush Color="{Binding Source={StaticResource CcInstance}, Path=CustomColorProperty} />
</Setter.Value>
</Setter>
</Style>