[WPF] UserControl et gestion du focus

Résolu
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 - 5 oct. 2009 à 14:32
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 - 7 oct. 2009 à 09:17
Hello,
Encore moi et mes UserControls
Dans mon appli, j'aimerais pouvoir donner le focus à des UserControls, c'est-à-dire faire apparaître un rectangle de focus par exemple. Pour ce faire, dans mon UserControl, j'ai un rectangle que je voudrais rendre visible quand l'objet "a le focus". J'ai donc rajouté un style avec un trigger sur la propriété "IsFocused" (cf. code ci-dessous). A la compilation, Visual me dit qu'il ne peut pas résoudre la propriété "Visibility".

    
        <Style>
            <Style.Triggers>
                <Trigger Property="UserControl.IsFocused" Value="True">
                    <Setter Property="UserControl.theFocus.Visibility" Value="Visible"/>
                </Trigger>
            </Style.Triggers>
        </Style>        
    

    <Canvas x:Name="LayoutRoot">
        <Canvas x:Name="theFocus" Visibility="Hidden"  Width="591" Height="494">
        ...
        </Canvas>
        ...
    </Canvas>



Quelqu'un peut-il m'aider à résoudre mon erreur?

D'avance merci,
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...

6 réponses

BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
6 oct. 2009 à 16:14
Bon, on m'a soufflé une solution dans l'oreille: passer par un CustomControl plutôt que par un UserControl:
    <Style TargetType="{x:Type ui:Category}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ui:Category}">
                    <Canvas x:Name="LayoutRoot">
                        <Canvas x:Name="theFocus" Visibility="Hidden" Width="560" Height="460">
                        ...
                        </Canvas>
                    </Canvas>

                    <ControlTemplate.Triggers>
                        <Trigger Property="IsFocused" Value="True">
                            <Trigger.Setters>
                                <Setter TargetName="theFocus" Property="Visibility" Value="Visible"/>
                            </Trigger.Setters>
                        </Trigger>
                    </ControlTemplate.Triggers>

                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Et effectivement, ça marche mieux.

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
3
cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018
6 oct. 2009 à 17:00
un custom control? un control template plutot non?

Car d'après le peu que je vois ici il s'agit toujours a mes yeux d'un user control


Cordialement,

KiTe

-----------------------
Ce qui nous tue pas nous rend plus fort,
Mais ce qui nous tue nous rend plus mort.
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
6 oct. 2009 à 17:06
Non, non, c'est bien un CustomControl.
Quand tu ajoutes un nouvel item dans ton projet, tu choisis "CustomControl". Visual te crée alors un CustomControl1.cs + un répertoire "thème" dans lequel tu trouve un generic.xaml qui est en fait un ResourceDictionary. Le code que j'ai collé est issu de ce fichier generic.xaml.

Bien sûr, si tu peux résoudre mon souci avec le UserControl, je suis preneur...


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018
6 oct. 2009 à 19:17
ah ok ça explique alors.

Je n'ai jamais saisi la différence fondamentale entre usercontrol et customcontrol, c'est surement pour ça ^^


Ce qui nous tue pas nous rend plus fort,
Mais ce qui nous tue nous rend plus mort.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Kite37 Messages postés 242 Date d'inscription lundi 6 mars 2006 Statut Membre Dernière intervention 17 janvier 2018
6 oct. 2009 à 19:19
Sinon pour ton problème, voir si avec un control rectangle ou border ce n'est pas possible.
Tu fais un setter sur la property adéquate (visibility, background suivant ce que tu veut comme résultat) avec un trigger sur le routed event MouseOver (qui peut être un peu assimilé a un focus).

Bizarre ceci dit qu'un trigger sur isfocused ne passe pas.


Ce qui nous tue pas nous rend plus fort,
Mais ce qui nous tue nous rend plus mort.
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
7 oct. 2009 à 09:17
Kite,
Apparemment, un UserControl n'est pas prévu pour utiliser le système de templating

If built correctly, a UserControl can take advantage of the benefits of rich content, styles, and triggers. However, if your control inherits from UserControl, people who use your control will not be able to use a DataTemplate or ControlTemplate to customize its appearance. It is necessary to derive from the Control class or one of its derived classes (other than UserControl) to create a custom control that supports templates.

Source: MSDN - Control Authoring Overview

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
Rejoignez-nous