Bonjour à tous,

Je dois créer un prototype d'application pour savoir si on part sur une solution WPF ou JavaFX. J'ai fait une première mouture basique montrant ce qu'on pouvait obtenir visuellement ou ce qu'on pourrait avoir. Suite à ça, on m'a demandé de regarder la partie customisation et là je suis légèrement dépassé.

Je dois donc donner la possibilité à l'utilisateur de modifier visuellement un composant graphique. En particulier "un bouton" que j'avais fait via un user control contenant un Path (pour le contour et le fond dégradé), un Label et une Image.
Donc je voudrais que l'utilisateur puisse modifier entièrement cela (par exemple mettre un contour rond ou un contour rectangulaire, retirer l'image, rajouter un tooltip... bref pas de limites)

Je suis donc partie sur un CustomControl. Comme le "Theme" Generic.xaml n'est pas publique, j'ai donc créer un autre Dictionnaire de resources (UICusto.xaml) que je merge dans le fichier Generic.xaml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
<ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/cat2CustomControlLib;component/Themes/UICusto.xaml"/>
    </ResourceDictionary.MergedDictionaries>
Pour les options de UICusto.xaml je lui définis Build Action à Content et Copy always pour qu'il soit accessible avec l'application.

Avant d'aller plus loin, j'ai donc pour l'instant bêtement copié le contenu du xaml de mon User Control dans mon UICusto.xaml: ça fonctionne le rendu est identique.

Mais quand je modifie à la main mon UICusto.xaml dans le répertoire de compilation et que je relance l'application à la main (je ne passe pas par Visual Studio histoire de ne pas écraser ma modif UICusto.xaml) ce n'est pas pris en compte.

Voici le détail du xaml (j'ai retiré l'image et le Label car pas utile ici) Pour mon test j'ai simplement changé la couleur du dégradé.

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
 
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:cat2CustomControlLib">
 
    <Style TargetType="{x:Type local:CCAppMixButton}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:CCAppMixButton}">
                    <Canvas>
                        <Canvas.Effect>
                            <DropShadowEffect/>
                        </Canvas.Effect>
                        <Path Stroke="Black" StrokeThickness="1">
                            <Path.Fill>
                                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                                    <GradientStop Offset="1" Color="#FF16103A"/>
                                    <GradientStop Offset="0" Color="#FF297BCD"/>
                                </LinearGradientBrush>
                            </Path.Fill>
                            <Path.Data>
                                <PathGeometry>
                                    <PathFigure StartPoint="150, 0">
                                        <LineSegment Point="40, 0"/>
                                        <QuadraticBezierSegment Point1="0, 0" Point2="0, 40" />
                                        <LineSegment Point="0, 150"/>
                                        <LineSegment Point="110, 150"/>
                                        <QuadraticBezierSegment Point1="150, 150" Point2="150, 110" />
                                        <LineSegment Point="150, 110"/>
                                        <LineSegment Point="150, 0"/>
                                    </PathFigure>
                                </PathGeometry>
                            </Path.Data>
                        </Path>
                    </Canvas>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>
Maintenant ma liste de questions:
  1. Est-ce que je suis partie sur la bonne solution? Quelles sont les best practices en matière de customisation?
  2. Pourquoi la modification manuelle du xaml ne fonctionne pas? qu'est-ce que j'ai oublié?
  3. Dans l'application final, ce CustomControl sera instancié plusieurs fois pour pouvoir lancer différentes actions différentes. Donc cela implique des images/titres différents. J'avais l'idée de créer des dependencyProperty et faire un binding dessus dans UICusto.xaml. Vous pensez que ça fonctionnera?


Je suis en autoformation pour l'instant donc désolé si je n'utilise pas les bons termes ou si je sors des aberrations.
Merci encore pour votre aide.