Benutzerdefiniertes WPF-Steuerelement: TemplateBinding to Image

Ich erstelle ein benutzerdefiniertes WPF-SteuerelementButton mit einemImage undText. Ich habe dem Steuerelement zwei Abhängigkeitseigenschaften hinzugefügt.ImagePath undTextund die Steuerungsvorlage (in Themes \ Generic.xaml) ist ein einfaches Stapelfenster, in dem Bild und Text horizontal angeordnet sind.

DasText Eigentum funktioniert gut. Aus irgendeinem Grund wird das Beispielbild in meinem Testprojekt jedoch nicht angezeigt, wenn ich es verwendeTemplateBinding zumImagePath Abhängigkeitseigenschaft, um ihren Pfad zu erhalten. Ich habe das Bild getestet, indem ich das vorübergehend ersetzteTemplateBinding im benutzerdefinierten Steuerelement mit einem Pfad zum Bild, in welchem ​​Fall es angezeigt wird.

Ich hoffe, dass jemand mit mehr Erfahrung in diesem Bereich einen Blick darauf werfen und mir sagen kann, warum das Steuerelement nicht wie erwartet funktioniert. Danke für Ihre Hilfe.

Meine VS 2008-Lösung enthält ein Projekt, CustomControlDemo. Das Projekt enthält ein benutzerdefiniertes Steuerelement, TaskButton.cs, und ein Hauptfenster, Window1.xaml, mit dem ich das Steuerelement teste. Mein Testbild, calendar.png, befindet sich in einem Ressourcenordner auf der Stammebene des Projekts, und Generic.xaml befindet sich in einem Themenordner, ebenfalls auf der Stammebene des Projekts.

Hier ist der Code für mein benutzerdefiniertes Steuerelement (von 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
    }
}

Und hier ist die Steuerungsvorlage (aus 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>

Und schließlich ist hier das Window1-Markup, mit dem ich das Steuerelement teste:

<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>

Irgendwelche Ideen, warum der Bildpfad nicht funktioniert? Danke noch einmal.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage