2008-11-29 8 views
8

Ich habe einen Button-Steuerelement-Stil und ich möchte das Padding von dem ändern, was die datengebundene Version für ein Glyph, das einen 2-Pixel-Offset benötigt, anpassen. Ich werde verwenden SimpleButton- von SimpleStyles.xaml als Beispiel (... zeigt, wo der Trigger-Code wurde für Prägnanz entfernt):Können Sie "Mathe" in WPF-Formatvorlagen verwenden, die datengebunden sind

<Style x:Key="SimpleButton" TargetType="{x:Type Button}" BasedOn="{x:Null}"> 
    <Setter Property="FocusVisualStyle" Value="{DynamicResource SimpleButtonFocusVisual}"/> 
    <Setter Property="Background" Value="{DynamicResource NormalBrush}"/> 
    <Setter Property="BorderBrush" Value="{DynamicResource NormalBorderBrush}"/> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type Button}"> 
      <!-- We use Grid as a root because it is easy to add more elements to customize the button --> 
      <Grid x:Name="Grid"> 
      <Border x:Name="Border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}"/> 

       <!-- Content Presenter is where the text content etc is placed by the control. The bindings are useful so that the control can be parameterized without editing the template --> 
      <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" RecognizesAccessKey="True"/> 
      </Grid> 
    ... 
    </Setter.Value>      
    </Setter> 
</Style> 

Was ich tun möchte, ist etwas mehr Spielraum hinzuzufügen, wo Padding = "{Template Polsterung}". Etwas wie Padding = "{TemplateBinding Padding} + 2,0,0,0".

Gibt es eine XAML-Syntax dazu? Wenn nicht, gibt es einen besten Ansatz, wenn Sie dies in Code (Decorator?) Tun?

Antwort

8

Derzeit XAML analysieren keine Ausdrücke in Syntax Bindung, etc. Jedoch Sie sich ein IValueConverter oder IMultiValueConverter aushelfen können:

XAML:

<Setter.Value> 
    <ControlTemplate TargetType="{x:Type Button}"> 
     <Grid x:Name="Grid"> 
     <Grid.Resources> 
      <local:ThicknessAdditionConverter x:Key="AdditiveThickness" /> 
     </Grid.Resources> 
     <Border x:Name="Border"> 
      <Border.Padding> 
       <Binding Path="Padding" RelativeSource="{RelativeSource TemplatedParent}" 
          Converter="{StaticResource AdditiveThickness}"> 
        <Binding.ConverterParameter> 
         <Thickness>2,0,0,0</Thickness> 
        </Binding.ConverterParameter> 
       </Binding> 
      </Border.Padding> 
     </Border> 
... 
</Setter.Value> 

IValueConverter Code hinter:

public class ThicknessAdditionConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value == null) return new Thickness(0, 0, 0, 0); 
     if (!(value is Thickness)) throw new ArgumentException("Value not a thickness", "value"); 
     if (!(parameter is Thickness)) throw new ArgumentException("Parameter not a thickness", "parameter"); 

     var thickness = new Thickness(0, 0, 0, 0); 
     var t1 = (Thickness)value; 
     var t2 = (Thickness)parameter; 

     thickness.Left = t1.Left + t2.Left; 
     thickness.Top = t1.Top + t2.Top; 
     thickness.Right = t1.Right + t2.Right; 
     thickness.Bottom = t1.Bottom + t2.Bottom; 

     return thickness; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
2

Nein, nicht in dieser Version von XAML - verwenden Sie einen Wertkonverter, um Ihre Berechnungen durchzuführen.

+0

Können Sie ein Beispiel mit einem Wertkonverter, um diese Mathe zu tun - es scheint eher wie Missbrauch für mich. –

3

Es ist ein Produkt, bei Blendables.com verfügbar Eval genannt Bindung und Einfache Bindung dies jetzt der Fall ist. (Das Produkt ist nicht frei) Überprüfen Sie die whitepaper hier

Zum Beispiel für den Balg XAML-Code benötigen Sie einen Konverter, um den Vorgang zu tun.

<Ellipse Fill="Blue" Height="50" 
    Width="{Binding RelativeSource={RelativeSource Self}, 
     Path=Height, Converter={StaticResource MyConverter}}" /> 

Aber mit EvalBinding können Sie wie unten tun

<Ellipse Fill="Blue" Height="50" 
    Width="{blendables:EvalBinding [{Self}.Height]/2}" /> 
1

Sie können einige einfache Berechnungen durchführen, indem Sie Transformationen nutzen.

prüfen diesen Trick heraus, dass Charles Petzold vor mit einer langen Zeit kam: http://www.charlespetzold.com/blog/2006/04/060223.html

Leider scheint es nicht Ihr spezielles Szenario zu helfen ... da Sie nur wollen Left-Eigenschaft ändern der Thickness-Typ für das Padding ... und das ist keine Abhängigkeitseigenschaft, an die Sie allein binden können.

Ich fühlte mich jedoch gezwungen, diese Antwort hinzuzufügen, falls es anderen hilft, die ihren Weg über Google oder eine andere Suchmaschine finden.