Sto creando un controllo personalizzato WPF, un Button
con un Image
e Text
. Ho aggiunto due proprietà di dipendenza al controllo, ImagePath
e Text
, e il modello di controllo (in Themes \ Generic.xaml) è un pannello di stack semplice che dispone l'immagine e il testo orizzontalmente.Controllo personalizzato WPF: TemplateBinding to Image
La proprietà Text
funziona correttamente. Ma per qualche motivo, l'immagine di esempio nel mio progetto di test non viene visualizzata quando utilizzo la proprietà di dipendenza per ottenere il suo percorso. Ho testato l'immagine sostituendo temporaneamente il TemplateBinding
nel controllo personalizzato con un percorso per l'immagine, nel qual caso appare.
Spero che qualcuno con più esperienza in questo settore possa dare un'occhiata e dirmi perché il controllo non funziona come previsto. Grazie per l'aiuto.
La soluzione VS 2008 contiene un progetto, CustomControlDemo. Il progetto contiene un controllo personalizzato, TaskButton.cs e una finestra principale, Window1.xaml, che utilizzo per testare il controllo. La mia immagine di prova, calendar.png, si trova in una cartella Risorse al livello root del progetto e Generic.xaml si trova in una cartella Temi, anche a livello di root del progetto.
Ecco il codice per il mio controllo personalizzato (da 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
}
}
E qui è il modello di controllo (da 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>
E, infine, ecco è il markup Window1 che sto usando per testare il controllo:
<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>
Tutte le idee perché il percorso dell'immagine non è wor re? Grazie ancora.