2013-08-07 13 views
7

Ok Mam aplikację WPF, w której mam słownik zasobów. W słowniku mam nowy styl dla Button, który wygląda tak:WPF Dodawanie niestandardowej właściwości w formancie

<Style x:Key="MenuButtonStyle" TargetType="Button"> 
     <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 

       <Grid> 
        <Image x:Name="Imager" RenderOptions.BitmapScalingMode="HighQuality" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Tag}" VerticalAlignment="Center" HorizontalAlignment="Center" Stretch="UniformToFill"/> 
       </Grid> 

       <ControlTemplate.Triggers> 
        <Trigger Property="IsMouseOver" Value="true"> 
         <Setter TargetName="Imager" Property="Width" Value="24" /> 
         <Setter TargetName="Imager" Property="Height" Value="24" /> 
        </Trigger> 
        <Trigger Property="IsPressed" Value="true"> 
         <Setter TargetName="Imager" Property="Width" Value="16" /> 
         <Setter TargetName="Imager" Property="Height" Value="16" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

i używać tej stye w moim XAML tak:

<Button x:Name="Home" Style="{DynamicResource MenuButtonStyle}" Width="20" Height="20" Tag="\Images\Home.png"/> 
<Button x:Name="Settings" Style="{DynamicResource MenuButtonStyle}" Width="20" Height="20" Tag="\Images\Settings.png"/> 

Teraz to, co chcę zrobić, to utworzyć nowy obiekt w stylu Button nazwie OverWidth i OverHeight aby używać go tak:

<Trigger Property="IsMouseOver" Value="true"> 
    <Setter TargetName="Imager" Property="Width" Value= OVERWIDTH/> 
    <Setter TargetName="Imager" Property="Height" Value= OVERHEIGHT/> 
</Trigger> 

aw XAML:

<Button x:Name="Home" Style="{DynamicResource MenuButtonStyle}" Width="20" Height="20" Tag="\Images\Home.png" OVERWIDTH = "24"/> 

Nie wiem nawet, czy jest to możliwe. Nie chcę używać Binding SomeIntenger z kodu C#. Z góry dzięki.

Odpowiedz

19

Można użyć attached properties:

public class Extensions 
{ 
    public static readonly DependencyProperty OverWidthProperty = 
     DependencyProperty.RegisterAttached("OverWidth", typeof(double), typeof(Extensions), new PropertyMetadata(default(double))); 

    public static void SetOverWidth(UIElement element, double value) 
    { 
     element.SetValue(OverWidthProperty, value); 
    } 

    public static double GetOverWidth(UIElement element) 
    { 
     return (double)element.GetValue(OverWidthProperty); 
    } 
} 

XAML:

xmlns:extensions="clr-namespace:NAMESPACE FOR Extensions class" 

<Trigger Property="IsMouseOver" Value="true"> 
    <Setter Property="MinWidth" Value="{Binding Path=(extensions:Extensions.OverWidth), RelativeSource={RelativeSource Self}}"/> 
</Trigger> 

<Button extensions:Extensions.OverWidth="100" Width="10"/>