2009-12-27 13 views
0

J'ai récemment joué avec WPF et j'ai rencontré un certain nombre de problèmes que je ne peux pas résoudre. J'ai le code suivant dans mon generic.xaml:WPF Binding & Converters

<Style TargetType="{x:Type local:ClearButton}">  
    <Style.Resources> 
     <con:ValueConverter x:Key="converter" /> 
    </Style.Resources> 
    <Setter Property="Width" Value="20" /> 
    <Setter Property="Height" Value="20" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:ClearButton}"> 
       <Grid> 

        <Image Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"> 
         <Image.Style> 
          <Style TargetType="{x:Type Image}"> 
           <Setter Property="Source" Value="/WPF-Libraries;component/Resources/ClearEnabled.png" /> 
           <Style.Triggers> 

            <Trigger Property="IsMouseOver" Value="True"> 
             <Setter Property="BitmapEffect"> 
              <Setter.Value> 
               <OuterGlowBitmapEffect Opacity="0.5" GlowColor="Red" GlowSize="3" /> 
              </Setter.Value> 
             </Setter> 
            </Trigger> 

            <Trigger Property="IsEnabled" Value="False"> 
             <Setter Property="Source" 
               Value="/WPF-Libraries;component/Resources/ClearDisabled.png" /> 
            </Trigger> 

            <!--Binding #1--> 
            <Trigger Property="{TemplateBinding local:ClearButton.IsPressed}" Value="True"> 
             <Setter Property="RenderTransform"> 
              <Setter.Value> 
               <!--Binding #2--> 
               <ScaleTransform CenterX="CONVERTER BINDING:PASS WIDTH TO CONVERTER" CenterY="CONVERTER BINDING:PASS HEIGHT TO CONVERTER" ScaleX="0.75" ScaleY="0.75" /> 
              </Setter.Value> 
             </Setter> 
            </Trigger> 

           </Style.Triggers>       
          </Style> 
         </Image.Style> 
        </Image> 

        <Border Background="{TemplateBinding Background}" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}"> 
        </Border> 

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

Je ne peux pas obtenir la liaison # 1 au travail. Je veux lier le déclencheur à la propriété IsPressed du bouton, quelle devrait être la liaison? Aussi quelle devrait être la liaison pour la reliure # 2 si je veux passer la largeur et la hauteur du bouton au convertisseur?

Aussi je pourrait déclencher le mécanisme de cette façon à la place:

<Style TargetType="{x:Type local:ClearButton}"> 
    <Style.Resources> 
     <con:ValueConverter x:Key="converter" /> 
    </Style.Resources> 
    <Setter Property="Width" Value="20" /> 
    <Setter Property="Height" Value="20" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:ClearButton}"> 
       <!--Abbreviated--> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 

    <Style.Triggers> 
     <!--Binding #1--> 
     <Trigger Property="{TemplateBinding local:ClearButton.IsPressed}" Value="True"> 
      <Setter Property="RenderTransform"> 
       <Setter.Value> 
        <!--Binding #2--> 
        <ScaleTransform CenterX="CONVERTER BINDING" CenterY="CONVERTER BINDING" ScaleX="0.75" ScaleY="0.75" /> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

Quelle est la meilleure et ce serait la liaison être pour la liaison # 1 et # 2?

Répondre

1

Les deux approches sont légèrement décalées. Votre première approche a du mal à atteindre la propriété IsPressed à l'aide de la liaison, mais la propriété Property de l'objet Trigger n'est pas DependencyProperty et ne prend donc pas en charge la liaison.

Votre seconde approche est plus proche de la marque, mais elle est toujours incorrecte. Elle utilise à nouveau la propriété Propriété du déclencheur.

Check this out à la place:

<Style TargetType="Button" x:Key="ClearButtonStyle"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <Grid> 
        <TextBlock 
         Name="x" 
         Text="I will change my color when ou press me" 
         TextAlignment="Center" 
         VerticalAlignment="Center" 
         Foreground="Red" 
         TextWrapping="Wrap"/> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsPressed" Value="True"> 
         <Setter 
          TargetName="x" 
          Property="Foreground" 
          Value="Green"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Notez que je mets la logique de déclenchement au niveau du modèle de contrôle (en spécifiant l'élément cible), et non sur l'élément individuel (le TextBlock dans ce cas).

+0

La propriété Property du déclencheur? – Austin

+0

Désolé pour le double post, j'ai rencontré un autre problème. Après avoir essayé votre approche, il détecte maintenant quand l'utilisateur appuie sur le bouton mais pour une raison quelconque, le convertisseur ne fonctionne pas. Voici le code: http://snippets.symfony-project.org/snippet/381 Le CenterX et CenterY semblent être égal à 0. Je suppose que c'est un problème avec la liaison. – Austin

+0

Lorsque vous utilisez une liaison sans spécifier de source, la valeur par défaut est le DataContext de l'objet contenant la liaison. Vous souhaitez probablement faire référence à la largeur du bouton, mais le bouton n'est pas son propre contexte de données. Pour pouvoir faire référence à l'objet bouton, ajoutez ce qui suit à votre liaison 'RelativeSource = {RelativeSource Mode = FindAncestor, AncestorType = Button}' –