WPF Custom Control: TemplateBinding to Image
Tworzę formant niestandardowy WPF, aButton
zImage
iText
. Dodałem dwie właściwości zależności do kontrolki,ImagePath
iText
, a szablon kontrolny (w Motywach Generic.xaml) to prosty panel stosu, który układa obraz i tekst poziomo.
TheText
właściwość działa dobrze. Ale z jakiegoś powodu przykładowy obraz w moim projekcie testowym nie pojawia się, gdy używamTemplateBinding
doImagePath
właściwość zależności, aby uzyskać ścieżkę. Testowałem obraz, zastępując go tymczasowoTemplateBinding
w formancie niestandardowym ze ścieżką do obrazu, w którym to przypadku się pojawia.
Mam nadzieję, że ktoś z większym doświadczeniem w tej dziedzinie może spojrzeć i powiedzieć mi, dlaczego kontrola nie działa zgodnie z oczekiwaniami. Dzięki za pomoc.
Rozwiązanie My VS 2008 zawiera jeden projekt, CustomControlDemo. Projekt zawiera niestandardową kontrolę, TaskButton.cs oraz główne okno Window1.xaml, którego używam do testowania formantu. Mój obraz testowy, calendar.png, znajduje się w folderze Zasoby na poziomie głównym projektu, a Generic.xaml znajduje się w folderze Motywy, również na poziomie głównym projektu.
Oto kod mojej niestandardowej kontroli (z 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
}
}
A oto szablon kontrolny (z 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>
I wreszcie, tutaj jest znacznik Window1, którego używam do testowania kontroli:
<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>
Jakieś pomysły, dlaczego ścieżka obrazu nie działa? Dzięki jeszcze raz.