5 votes

Problème d'application d'un style sur un UserControl WPF

J'ai un user-control et je veux l'utiliser dans un autre projet. Il n'y a pas de problème lorsque je fixe directement une valeur à ses propriétés :

<local:MyUserControl prop1="val1" prop2="val2">
    ...
</local:MyUserControl>

Mais je ne peux pas lui appliquer un style. J'ai essayé :

<Window ...>
    <Window.Resources>
        <Style x:Key="MyUserControlStyle" TargetType="{x:Type local:MyUserControl}">
            <Setter Property="prop1" Value="val1"/>
            <Setter Property="prop2" Value="val2"/>
        </Style>
    </Window.Resources>

    <Grid>
        <local:MyUserControl Style="{StaticResource ResourceKey=MyUserControlStyle}">
            ...
        </local:MyUserControl>
    </Grid>
</Window>

Où me suis-je trompé ? -Merci

5voto

Mimi Points 594

En utilisant les instructions de ce cher @Mario Vernari, j'ai découvert que le problème était dû à une mauvaise stratégie que j'avais utilisée pour créer mon UserControl. Je voulais créer un UserControl qui puisse en contenir d'autres. J'avais donc essayé ceci :

<UserControl x:Class="MyNamespace.MyUserControl"
             ...
             Style="{DynamicResource ResourceKey=MyUserControlStyle}">
    <UserControl.Resources>
        ...
        <Style x:Key="MyUserControlStyle" TargetType="{x:Type UserControl}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type UserControl}">
                        <Border BorderBrush="{Binding Path=DP1}">
                            ...
                            <ContentPresenter ... Content="{TemplateBinding Content}"/>
                            ...
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </UserControl.Resources>
</UserControl>

DP1 est une propriété de dépendance de type Brush . Le UserControl qui a été créé de cette manière fonctionne si vous définissez ses propriétés (comme DP1 ) directement. Absolument, ce n'est pas la bonne méthode, comme @Mario me l'a dit :

...Lorsque vous utilisez un UserControl, cela signifie que vous déjà connaît sa mise en page, et il n'est pas nécessaire de styliser davantage le contrôle. Vous définissez son style deux fois en même temps il en résulte une collision...

Et il a ajouté :

Au lieu de cela, vous devez utiliser un CustomControl ; définissez le style par défaut dans le fichier Thèmes (si vous possédez Visual Studio ordinaire, cela se fait automatiquement). Ensuite, vous pouvez contourner le style par défaut dans votre propre application. De la même manière que vous le feriez pour une classe de base normale et ses dérivés.

Suivez ça : http://www.codeproject.com/KB/WPF/WPFCustomControl.aspx ...

Évidemment, dans ce cas, nous devons dériver notre contrôle sans regard à partir de ContentControl (au lieu de Control ). Vous pouvez consulter este & este pour maîtriser les détails.

Ici, je remercie à nouveau @Mario. ;)

0voto

Varun Jain Points 172

Vous donnez Style="{StaticResource ResourceKey=MyUserControlStyle}" .

C'est juste que Style="{StaticResource MyUserControlStyle}" .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X