2008-11-29 16 views
8

Düğme denetim stilim var ve veriye bağlı sürüm ne olursa olsun dolguyu değiştirmek istiyorum 2 giksel bir ofset gerektiren bir glifi ayarlamak.Veri bağlantılı olan WPF Stilleri içinde "matematik" yapabiliyor musunuz

<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> 

Ne yapmak istediğim bazı ekstra tolerans eklemek nerede Dolgu = "{TemplateBinding: Ben (... tetik kodu özlü olmak kaygısıyla kaldırıldı yerleri gösteren) bir örnek olarak SimpleStyles.xaml dan SimpleButton kullanacağız Dolgu malzemesi}". Padding = "{TemplateBinding Padding} + 2,0,0,0" gibi bir şey.

Bunun için bir XAML sözdizimi var mı? Eğer değilse, bu kodu yaparken en iyi yaklaşım var mı (Dekoratör?)?

cevap

8

Şu XAML kendin yardımcı olmak için bir IValueConverter veya IMultiValueConverter kullanabilirsiniz vb Ancak, sözdizimi Bağlama ifadeler ayrıştırmak değildir:

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 kodu arkasında:

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

Hayır, XAML'nin bu sürümünde değil - matematiğinizi yapmak için bir Değer Dönüştürücüsü kullanın.

+0

Eğer bir örnek verebilir Bu matematiği yapmak için bir değer dönüştürücü kullanarak - benim için yanlış kullanım gibi görünüyor. –

3

şimdi bunu yapar Bağlama ve basit bağlanma Eval denilen Blendables.com mevcut bir ürün bulunmamaktadır. (Ürün ücretsiz değil) whitepaper'a göz atın.

Örneğin, Körük XAML kodu için işlemi yapmak için bir dönüştürücüye ihtiyacınız vardır.

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

Ama EvalBinding ile size feryat

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

Geliş this library yılında ExpressionConverter gibi yapabilirsiniz.

1

Dönüşümlerden yararlanarak bazı basit matematik yapabilirsiniz.

Kontrol dışarı Charles Petzold önce uzun bir süre ile geldi bu hileyi: http://www.charlespetzold.com/blog/2006/04/060223.html

Ne yazık ki, sadece sol tarafında özelliğini değiştirmek istiyorum çünkü ... belirli senaryo yardımcı görünmüyor Dolgu için Kalınlık türü ... ve bu, tek başına bağlanabileceğiniz bir bağımlılık özelliği değildir. Bununla birlikte, bu cevabı Google veya başka bir arama motoru aracılığıyla burayı burada bulabilen diğer kullanıcılara yardımcı olması durumunda eklemem gerektiğini hissettim.

İlgili konular