2010-05-24 10 views
1

Voici mon application simple:Utilisation AttachedProperty dans le style dans ControlTemplate

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:app="clr-namespace:WpfApplication1" 
    Title="Window1" Height="300" Width="300"> 
    <Window.Resources> 
     <Style x:Key="Test"> 
      <Setter Property="Button.Template"> 
       <Setter.Value> 
        <ControlTemplate> 
         <Border BorderBrush="Blue" 
           BorderThickness="3" 
           Background="Black" 
           CornerRadius="{Binding app:Extras.CornerRadius}" 
           >        
         </Border> 
         </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Window.Resources> 
    <Grid> 
     <Button Height="23" 
       HorizontalAlignment="Left" 
       Margin="29,26,0,0" 
       Name="button1" 
       VerticalAlignment="Top" Width="75" 
       app:Extras.CornerRadius="10" 
       Style="{StaticResource Test}" 
       >Button</Button> 
    </Grid> 
</Window> 

Voici mon AttachedProperty:

namespace WpfApplication1 
{ 
    public class Extras 
    { 
     public static readonly DependencyProperty CornerRadiusProperty = DependencyProperty.RegisterAttached(
      "CornerRadius", 
      typeof(double), 
      typeof(Button), 
      new FrameworkPropertyMetadata(1.0d, FrameworkPropertyMetadataOptions.AffectsRender) 
     ); 

     public static void SetCornerRadius(UIElement element, double value) 
     { 
      element.SetValue(CornerRadiusProperty, value); 
     } 
     public static double GetCornerRadius(UIElement element) 
     { 
      return (double)element.GetValue(CornerRadiusProperty); 
     } 

    } 
} 

CornerRadius="{Binding app:Extras.CornerRadius}" Bien sûr, cela ne fonctionne pas. alors comment puis-je obtenir de la valeur d'ici app:Extras.CornerRadius="10"

merci d'avance!

Répondre

2

Utilisez un TemplateBinding plutôt qu'un Binding:

    <Border BorderBrush="Blue" 
          BorderThickness="3" 
          Background="Black" 
          CornerRadius="{TemplateBinding app:Extras.CornerRadius}" 
          >    

OK, essayer alors:

<Border BorderBrush="Blue" 
     BorderThickness="3" 
     Background="Black" 
     CornerRadius="{Binding (app:Extras.CornerRadius), RelativeSource={x:Static RelativeSource.TemplatedParent}}" 
     >  
+0

dans le concepteur, il donne l'erreur: « Vous ne trouvez pas le membre statique 'CornerRadiusProperty' sur le type "Bouton". " , lors de l'exécution "Impossible de convertir la valeur de l'attribut 'CornerRadius' en objet de type 'System.Windows.TemplateBindingExtension' Erreur sur l'objet 'System.Windows.Controls.ControlTemplate' dans le fichier de balisage" – Andrey

+0

voir la mise à jour de la réponse –

+0

System. Erreur Windows.Data Erreur 39: BindingExpression path: '(app: Extras.CornerRadius)' propriété introuvable sur 'objet' '' Button '(Nom =' button1 ')'. BindingExpression: Path = (app: Extras.CornerRadius); DataItem = 'Button' (Name = 'button1'); l'élément cible est 'Border' (Name = ''); La propriété target est 'CornerRadius' (tapez 'CornerRadius') – Andrey