Je crée un contrôle personnalisé WPF, un Button
avec un Image
et un Text
. J'ai ajouté deux propriétés de dépendance au contrôle, ImagePath
et Text
, et le modèle de contrôle (dans Thèmes \ Generic.xaml) est un panneau de pile simple qui organise l'image et le texte horizontalement.Contrôle personnalisé WPF: TemplateBinding to Image
La propriété Text
fonctionne correctement. Mais pour une raison quelconque, l'image d'exemple dans mon projet de test n'apparaît pas lorsque j'utilise TemplateBinding
à la propriété de dépendance ImagePath
pour obtenir son chemin. J'ai testé l'image en remplaçant temporairement le TemplateBinding
dans le contrôle personnalisé avec un chemin d'accès à l'image, auquel cas il apparaît.
J'espère que quelqu'un avec plus d'expérience dans ce domaine peut jeter un coup d'oeil et me dire pourquoi le contrôle ne fonctionne pas comme prévu. Merci de votre aide.
Ma solution VS VS 2008 contient un projet, CustomControlDemo. Le projet contient un contrôle personnalisé, TaskButton.cs et une fenêtre principale, Window1.xaml, que j'utilise pour tester le contrôle. Mon image de test, calendar.png, se trouve dans un dossier Resources au niveau racine du projet et Generic.xaml se trouve dans un dossier Themes, également au niveau racine du projet.
Voici le code de mon contrôle personnalisé (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
}
}
Et voici le modèle de contrôle (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>
Et enfin, ici est le balisage Window1 que j'utilise pour tester le contrôle:
<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>
Des idées pour lesquelles le chemin de l'image ne fonctionne pas Roi? Merci encore.