Objet templatebinding pour DependencyProperty sur un contrôle personnalisé ne fonctionne pas
Actuellement, je travaille sur un simple bouton personnalisé qui utilise l'utilisateur a fourni des images comme arrière-plan pour les pressés et les états normaux. J'ai beaucoup de boutons donc j'ai décidé d'écrire un bouton personnalisé et de mettre en œuvre deux propriétés pour les pressés et les états normaux " des photos.
Voici le code que j'utilise
public partial class ThemeableButton : Button
{
public ThemeableButton()
{
InitializeComponent();
}
public static readonly DependencyProperty PressedContentBackgroundSourceProperty = DependencyProperty.Register(
"PressedContentBackgroundSource", typeof(ImageSource), typeof(ThemeableButton), null);
public ImageSource PressedContentBackgroundSource
{
get { return (ImageSource)GetValue(PressedContentBackgroundSourceProperty); }
set
{
(value as BitmapImage).CreateOptions = BitmapCreateOptions.BackgroundCreation;
SetValue(PressedContentBackgroundSourceProperty, value);
}
}
public static readonly DependencyProperty NormalContentBackgroundSourceProperty =
DependencyProperty.Register("NormalContentBackgroundSource", typeof(ImageSource), typeof(ThemeableButton), null);
public ImageSource NormalContentBackgroundSource
{
get { return (ImageSource)GetValue(NormalContentBackgroundSourceProperty); }
set
{
(value as BitmapImage).CreateOptions = BitmapCreateOptions.BackgroundCreation;
SetValue(NormalContentBackgroundSourceProperty, value);
}
}
}
J'ai écrit le style de ce bouton comme suit
<Style x:Key="ThemeableButtonTemplate" TargetType="MJbox_UIComponents_Controls:ThemeableButton">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderBrush" Value="{StaticResource PhoneForegroundBrush}"/>
<Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/>
<Setter Property="BorderThickness" Value="{StaticResource PhoneBorderThickness}"/>
<Setter Property="FontFamily" Value="{StaticResource PhoneFontFamilySemiBold}"/>
<Setter Property="FontSize" Value="{StaticResource PhoneFontSizeMediumLarge}"/>
<Setter Property="Padding" Value="0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="MJbox_UIComponents_Controls:ThemeableButton">
<Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Source" Storyboard.TargetName="ButtonBackground">
<DiscreteObjectKeyFrame KeyTime="0" Value="{TemplateBinding NormalContentBackgroundSource}">
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Pressed">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Source" Storyboard.TargetName="ButtonBackground">
<DiscreteObjectKeyFrame KeyTime="0" Value="{TemplateBinding PressedContentBackgroundSource}">
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Border BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" CornerRadius="0">
<Image x:Name="ButtonBackground" Stretch="None" Source="{TemplateBinding NormalContentBackgroundSource}"/>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
J'ai essayé un exemple simple
<Controls:ThemeableButton Style="{StaticResource ThemeableButtonTemplate}" x:Name="btnDidntNeedIt" NormalContentBackgroundSource="{Binding Source={StaticResource DefaultTheme}, Path=DidntHaveButtonUnselected}"
PressedContentBackgroundSource="{Binding Source={StaticResource DefaultTheme}, Path=DidntHaveButtonSelected}"
/>
mais l'image ne s'affiche pas, j'ai essayé en supprimant l'objet templatebinding par le style et l'a remplacée par la source par rapport au fichier image, et il a bien fonctionné. Je ne veux pas créer un style personnalisée pour chaque bouton de l'application. Une solution de contournement possible?
Vous devez vous connecter pour publier un commentaire.
J'ai rencontré cette avant, objet templatebinding ne fonctionne pas pour les propriétés de dépendance personnalisées sur les contrôles. Voir ces questions connexes:
des problèmes avec la liaison de modèle et de liaison du composant personnalisé
Objet templatebinding ne fonctionne pas dans certains cas(lors de l'utilisation de TranslateTransform)
J'ai toujours utilisé ce lieu:
Il est sémantiquement le même comme objet templatebinding, et peut également soutenir des convertisseurs de valeur etc ...
<Rectangle Fill="{TemplateBinding FillBrush}" />
dans mon contrôle personnalisé de laControlTemplate
remplit laRectangle
avec monFillBrush
personnalisé propriété de dépendance, même en montrant que la propriété de VS la propriété de feuille et de le remplir avec ce que je la demande au moment de la création. Peut-être que c'est quelque chose de nouveau depuis 2011? De toute façon, il fonctionne très bien maintenant. (Mais attention pour animer pour des choses qui ne sont pasFreezeable
s. Vous ne pouvez toujours pas faire ça.)TemplateBinding
ne fonctionne pas sur les propriétés deFreezeable
s. Aussi loin que je peux dire, il échoue silencieusement. Votre solution est certainement dans ces cas.