IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Où définir un gestionnaire d'evenement appelé dans un style depuis un dictionnaire de ressources ?


Sujet :

Windows Presentation Foundation

  1. #1
    Membre régulier Avatar de stdebordeau
    Homme Profil pro
    Statisticien
    Inscrit en
    Septembre 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43

    Informations professionnelles :
    Activité : Statisticien
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2007
    Messages : 241
    Points : 120
    Points
    120
    Par défaut Où définir un gestionnaire d'evenement appelé dans un style depuis un dictionnaire de ressources ?
    Bonjour, j'ai cherché, j'ai cherché et je cherche encore...
    J'ai dans mon projet plusieurs dictionnaires de ressources réservés chacun à des composants spécifiques. En particulier j'en ai un pour les styles appliqués aux ToggleButton, et un autre pour ceux des ListViewItem. Le deuxième appelant le premier.

    celui des ListViewItem (il contient un toogle appelant le style situé dans le dictionnaire des ToggleButton) :

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:QTEST">
     
     
        <SolidColorBrush x:Key="Item.MouseOver.Background" Color="#1F26A0DA"/>
        <SolidColorBrush x:Key="Item.MouseOver.Border" Color="#a826A0Da"/>
        <SolidColorBrush x:Key="Item.SelectedInactive.Background" Color="#3DDADADA"/>
        <SolidColorBrush x:Key="Item.SelectedInactive.Border" Color="#FFDADADA"/>
        <SolidColorBrush x:Key="Item.SelectedActive.Background" Color="#3D26A0DA"/>
        <SolidColorBrush x:Key="Item.SelectedActive.Border" Color="#FF26A0DA"/>
     
        <Style x:Key="FocusVisualStyle_1" TargetType="{x:Type ListViewItem}">
            <Setter Property="BorderBrush" Value="Red"/>
        </Style>
     
        <Style x:Key="ListviewItemStyle_1" TargetType="ListViewItem">
            <Setter Property="SnapsToDevicePixels" Value="True"/>
            <Setter Property="Padding" Value="4,1"/>
            <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
            <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="BorderBrush" Value="Transparent"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisualStyle_1}"/>
            <Setter Property="Visibility" Value="{Binding Path=visibilite}"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ListViewItem}">
                        <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                           <Grid>
                                    <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="30"/>
                                    <ColumnDefinition Width="10"/>
                                    <ColumnDefinition Width="{Binding Path=profondeur, Converter={StaticResource profondeurmargetreeviewitem}}"/>
                                    <ColumnDefinition Width="20" />
                                    <ColumnDefinition />
                                    </Grid.ColumnDefinitions>
                                    <Grid.RowDefinitions>
                                    <RowDefinition Height="18"/>
                                    <RowDefinition Height="Auto"/>
                                    </Grid.RowDefinitions>
     
                                <TextBlock Grid.Column="0" Grid.Row="0" Text="{Binding Path=rang}"/>
                                <TextBlock Grid.Column="1" Grid.Row="0" Text="{Binding Path=profondeur}"/>
     
                                <ToggleButton Grid.Column="3" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center"  SnapsToDevicePixels="True" x:Name="Expander" Style="{StaticResource TreeviewTogglePlusMoins}" IsChecked="{Binding Path=IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press" />
                                <ContentPresenter Grid.Column="4" Grid.Row="0" Grid.RowSpan="2" Content="{Binding Path=lib_court}"  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
                            </ContentPresenter>
                        </Grid>  
                        </Border>
                        <ControlTemplate.Triggers>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="IsMouseOver" Value="True"/>
                                </MultiTrigger.Conditions>
                                <Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.MouseOver.Background}"/>
                                <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.MouseOver.Border}"/>
                            </MultiTrigger>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="Selector.IsSelectionActive" Value="False"/>
                                    <Condition Property="IsSelected" Value="True"/>
                                </MultiTrigger.Conditions>
                                <Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.SelectedInactive.Background}"/>
                                <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.SelectedInactive.Border}"/>
                            </MultiTrigger>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="Selector.IsSelectionActive" Value="True"/>
                                    <Condition Property="IsSelected" Value="True"/>
                                </MultiTrigger.Conditions>
                                <Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.SelectedActive.Background}"/>
                                <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.SelectedActive.Border}"/>
                            </MultiTrigger>
                            <Trigger Property="IsEnabled" Value="False">
                                <Setter Property="TextElement.Foreground" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>
    celui des ToggleButton :
    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
    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:QTEST"
        xmlns:s="clr-namespace:System;assembly=mscorlib">
    
    
        <Style x:Key="TreeviewTogglePlusMoins" TargetType="{x:Type ToggleButton}">
            <Setter Property="Focusable" Value="False"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ToggleButton}">
                        <Grid Width="12" Height="12" SnapsToDevicePixels="True">
                            <!-- Rectangle 9x9 pixels -->
                            <Rectangle Width="12" Height="12" Fill="LightGray" Stroke="Gray" SnapsToDevicePixels="True" />
                            <!--<Ellipse Width="15" Height="15" Stroke="#919191" SnapsToDevicePixels="true">
                                <Ellipse.Fill>
                                    <LinearGradientBrush EndPoint="0.5,2" StartPoint="0.5,0">
                                        <GradientStop Color="White" Offset="0"/>
                                        <GradientStop Color="Silver" Offset="0.5"/>
                                        <GradientStop Color="LightGray" Offset="1"/>
                                    </LinearGradientBrush>
                                </Ellipse.Fill>
                            </Ellipse>-->
                            <!-- Vertical line inside rectangle -->
                            <Rectangle x:Name="ExpandPath" Width="1" Height="6" Stroke="Black" SnapsToDevicePixels="true" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                            <!-- Horizontal line inside rectangle -->
                            <Rectangle Width="6" Height="1" Stroke="Black" SnapsToDevicePixels="true" VerticalAlignment="Center" HorizontalAlignment="Center"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsChecked" Value="True">
                                <Setter Property="Visibility" TargetName="ExpandPath" Value="Collapsed"/>
                            </Trigger>
                            <Trigger Property="IsChecked" Value="false">
                                <Setter Property="Visibility" TargetName="ExpandPath" Value="Visible"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <EventSetter Event="Click" Handler= "TreeviewExpander_Click"/>
        </Style>
       
    </ResourceDictionary>
    Mon problème est que je ne sais pas ou définir le gestionnaire d'évènement "TreeviewExpander_Click" appelé dans l'evensetter du togglebutton.
    j'ai essayé au niveau de la classe de la fenêtre principale (MainWindow.xaml.vb) et au niveau de l'application (Application.xaml.vb) et dans un module séparé mais il renvoie toujours l'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"'Échec de la création d'un 'Handler' à partir du texte 'TreeviewExpander_Click'.' numéro de ligne '139' et position de ligne '36'."}
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"Impossible d'établir une liaison avec la méthode cible, car sa signature ou sa transparence de sécurité n'est pas compatible avec celle du type délégué."}
    Voici le bloc de déclaration de l'évènement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Public Shared ReadOnly TreeviewExpander_ClickEvent As RoutedEvent = EventManager.RegisterRoutedEvent("TreeviewExpander_Click", RoutingStrategy.Direct, GetType(RoutedEvent), GetType(MainWindow))
        Public Shared Sub TreeviewExpander_Click(sender As Object, e As RoutedEventArgs)
            MsgBox("hello")
        End Sub
    Je précise que l'ensemble des dictionnaires est bien fusionné au niveau de Application.xaml

    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
     
    <Application x:Class="Application"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:QTEST"
        xmlns:tools="clr-namespace:QTEST.Outils"
        StartupUri="MainWindow.xaml">
     
        <Application.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="Dictionnaire\QtestToogle.xaml"/>
                    <ResourceDictionary Source="Dictionnaire\QtestTextbox.xaml"/>
                    <ResourceDictionary Source="Dictionnaire\QtestLabel.xaml"/>
                    <ResourceDictionary Source="Dictionnaire\QtestColorBrush.xaml"/>
                    <ResourceDictionary Source="Dictionnaire\QtestTemplateSelector.xaml"/>
                    <ResourceDictionary Source="Dictionnaire\QtestConverter.xaml"/>
                    <ResourceDictionary Source="Dictionnaire\QtestListViewItem.xaml"/>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
     
        </Application.Resources>
     
    </Application>
    Qu'est ce qui ne va pas avec WPF ?

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    Qui ne pas du tout...
    Pour ajouter un Handler dans un Style situe dans un ResourceDictionary il faut :

    1/ un attribut x:Class suivi d'un nom de Class Qualifié pour ResourceDictionary
    mettons : StadeBordelais

    2/ ensuite il faut créer un Public Partial Class StadeBordelais du meme nom...


    c'est dans ce class partial qu'il faut declarer ce Handler avec signature apprpriée...
    NB: l'IntelliSense n'est d'aucun recours !!!

    exemple vb pour un style Button bidon pour l'exemple....

    code xaml du DicoMyButton:
    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
     
     
    <ResourceDictionary 
        x:Class="DicoMyButton"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <SolidColorBrush x:Key="BrushRed" Color="Red" />
        <SolidColorBrush x:Key="BrushBlue" Color="Blue"  />
        <Style TargetType="{x:Type Button}">
            <Style.Setters>
                <Setter Property="Background" Value="{StaticResource BrushBlue}"/>
                <EventSetter Event="Click" Handler="ChangeBackgroundClick"/>
            </Style.Setters>
     
     
        </Style>
    </ResourceDictionary>
    code behind.vb du dictionary:

    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
     
     
    Partial Public Class DicoMyButton
        Private buttonRed As SolidColorBrush
        Private buttonBlue As SolidColorBrush
        Public Sub New()
     
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            buttonRed = CType(Me.Item("BrushRed"), SolidColorBrush)
            buttonBlue = CType(Me.Item("BrushBlue"), SolidColorBrush)
        End Sub
        Public Sub ChangeBackgroundClick(ByVal sender As Object, ByVal e As RoutedEventArgs)
            If CType(sender, Button).Background Is buttonRed Then
                CType(sender, Button).Background = buttonBlue
            Else
                CType(sender, Button).Background = buttonRed
            End If
     
        End Sub
     
     
    End Class
    code xaml de App.xaml (cas ou il y une foultitude de dictionaries):

    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
     
     
    <Application x:Class="Application"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        StartupUri="MainWindow.xaml">
        <Application.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="DicoMyButton.xaml"/>
                    <!--autres dictionaries suivent ....-->
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Application.Resources>
    </Application>
    code xaml du simplistic Form user :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
        <Grid>
            <Button HorizontalAlignment="Center" Foreground="White"  FontSize="18" VerticalAlignment="Center"  Content="MonButton"></Button>
        </Grid>
    </Window>
    bon code...

  3. #3
    Membre régulier Avatar de stdebordeau
    Homme Profil pro
    Statisticien
    Inscrit en
    Septembre 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43

    Informations professionnelles :
    Activité : Statisticien
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2007
    Messages : 241
    Points : 120
    Points
    120
    Par défaut
    C'est tout simplement parfaitement parfait. Là je viens de dépasser un cap avec wpf. Merci bcp.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 17
    Dernier message: 09/03/2011, 11h14
  2. Réponses: 2
    Dernier message: 16/10/2009, 13h08
  3. DLL Visual C++ appelée dans un programme Visual Basic
    Par marseillais57 dans le forum MFC
    Réponses: 7
    Dernier message: 21/07/2005, 14h57
  4. appel dans des frames
    Par drizzt2511 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 11/01/2005, 09h40
  5. [C#] Evenement click dans un Panel
    Par keyser-soze dans le forum Windows Forms
    Réponses: 5
    Dernier message: 21/05/2004, 22h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo