Bonjour,

je veux faire un bouton avec un fond qui peut changer suivant une valeur d'une propriété d'un objet.

J'ai une classe qui dérive de Button, et qui a une propriété de type ImageSource, qui donne l'image qui doit être utilisée pour le bouton.

et là, je ne trouve pas comment initialiser cette propriété du bouton pour afficher quelque chose.

le code pour voir le problème :

la classe qui dérive de Button
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace SourceButton
{
publicclassNewButton : Button
{
public NewButton()
{
Source = newBitmapImage(newUri("pack://application:,,,/Collines.jpg"));
}
publicImageSource Source
{
get { return (ImageSource)GetValue(SourceProperty); }
set { SetValue(SourceProperty, value); }
}
publicstaticreadonlyDependencyProperty SourceProperty =
DependencyProperty.Register("Source", typeof(ImageSource), typeof(NewButton), newUIPropertyMetadata(newBitmapImage( newUri("pack://application:,,,/Collines.jpg"))));
}
}
la fenêtre principale, je définis deux styles, un qui affiche une image déclarée dans les ressources de la fenetre, et un qui utilise un Binding sur le bouton pour trouver l'image à afficher.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<Window x:Class="SourceButton.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sourcebutton="clr-namespace:SourceButton"
Title="Window1"
Height="300"
Width="300">
<Window.Resources>
<ImageSource x:Key="TheImage">pack://application:,,,/Collines.jpg</ImageSource>
<Style x:Key="TheButtonStyle" TargetType="{x:Type sourcebutton:NewButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type sourcebutton:NewButton}">
<Border BorderBrush="BlueViolet"
BorderThickness="5">
<Image Source="{Binding Path=Source, RelativeSource={RelativeSource Self}}" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="TheButtonStyle2"
TargetType="{x:Type sourcebutton:NewButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type sourcebutton:NewButton}">
<Border BorderBrush="Tomato"
BorderThickness="5">
<Image Source="{StaticResource TheImage}" />
</Border></ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<sourcebutton:NewButton Style="{StaticResource TheButtonStyle}" />
<sourcebutton:NewButton Grid.Row="1" Style="{StaticResource TheButtonStyle2}" />
</Grid>
</Window>
Voilà, le bouton qui est censé afficher l'image en utilisant le Binding avec la propriété du NewBouton est toujours vide.
Qu'est ce que je fais de travers ?

(en passant, si quelqu'un sait comment je peux garder l'indentation quand je copicolle à partir de VS, ça pourrait être sympa )