Estoy creando un control personalizado WPF, un Button
con un y Text
. He agregado dos propiedades de dependencia al control, ImagePath
y Text
, y la plantilla de control (en Themes \ Generic.xaml) es un panel de pila simple que organiza la imagen y el texto de forma horizontal.WPF Custom Control: TemplateBinding to Image
La propiedad Text
funciona bien. Pero por alguna razón, la imagen de muestra en mi proyecto de prueba no aparece cuando utilizo TemplateBinding
en la propiedad de dependencia ImagePath
para obtener su ruta. He probado la imagen al reemplazar temporalmente el TemplateBinding
en el control personalizado con una ruta a la imagen, en cuyo caso aparece.
Espero que alguien con más experiencia en esta área pueda echar un vistazo y decirme por qué el control no está funcionando como se esperaba. Gracias por tu ayuda.
Mi solución VS 2008 contiene un proyecto, CustomControlDemo. El proyecto contiene un control personalizado, TaskButton.cs y una ventana principal, Window1.xaml, que utilizo para probar el control. Mi imagen de prueba, calendar.png, se encuentra en una carpeta de Recursos en el nivel raíz del proyecto, y Generic.xaml se encuentra en una carpeta Temas, también en el nivel raíz del proyecto.
Aquí es el código de mi control personalizado (de TaskButton.cs):
using System.Windows;
using System.Windows.Controls;
namespace CustomControlDemo
{
public class TaskButton : RadioButton
{
#region Fields
// Dependency property backing variables
public static readonly DependencyProperty ImagePathProperty;
public static readonly DependencyProperty TextProperty;
#endregion
#region Constructors
/// <summary>
/// Default constructor.
/// </summary>
static TaskButton()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(TaskButton), new FrameworkPropertyMetadata(typeof(TaskButton)));
// Initialize ImagePath dependency properties
ImagePathProperty = DependencyProperty.Register("ImagePath", typeof(string), typeof(TaskButton), new UIPropertyMetadata(null));
TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(TaskButton), new UIPropertyMetadata(null));
}
#endregion
#region Dependency Property Wrappers
/// <summary>
/// The ImagePath dependency property.
/// </summary>
public string ImagePath
{
get { return (string)GetValue(ImagePathProperty); }
set { SetValue(ImagePathProperty, value); }
}
/// <summary>
/// The Text dependency property.
/// </summary>
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
#endregion
}
}
Y aquí es la plantilla de control (de Generic.xaml):
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CustomControlDemo">
<Style TargetType="{x:Type local:TaskButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:TaskButton}">
<StackPanel Height="Auto" Orientation="Horizontal">
<Image Source="{TemplateBinding ImagePath}" Width="24" Height="24" Stretch="Fill"/>
<TextBlock Text="{TemplateBinding Text}" HorizontalAlignment="Left" Foreground="{DynamicResource TaskButtonTextBrush}" FontWeight="Bold" Margin="5,0,0,0" VerticalAlignment="Center" FontSize="12" />
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
Y, por último, aquí es el marcado Window1 que estoy usando para probar el control:
<Window x:Class="CustomControlDemo.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:customControl="clr-namespace:CustomControlDemo"
Title="Window1" Height="300" Width="300">
<Grid>
<customControl:TaskButton ImagePath="Resources\calendar.png" Text="Calendar" />
</Grid>
</Window>
Cualquier idea por qué la ruta de la imagen no está WOR ¿Rey? Gracias de nuevo.