web-dev-qa-db-fra.com

WPF Ajout d'une propriété personnalisée dans un contrôle

Ok, j'ai une application WPF dans laquelle j'ai un dictionnaire de ressources. Dans le dictionnaire, j'ai un nouveau style pour une Button qui ressemble à ceci:

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

Et utilisez ce stye dans mon XAML comme ceci:

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

Maintenant, ce que je veux faire, c'est créer une nouvelle propriété dans le style Button nommé OverWidth et OverHeight afin de l'utiliser comme ceci:

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

Et en XAML:

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

Je ne sais même pas si c'est possible. Je ne veux pas utiliser Binding SomeIntengerde code C #. Merci d'avance.

13
oimitro

Vous pouvez utiliser les propriétés attachées :

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"/>
25
Vyacheslav Volkov

J'ai utilisé la propriété Tag, qui fonctionne très bien. Je peux écrire n'importe quoi sur Tag

Par exemple (AXML) sur un Button:

<Button x:Name="Btn80" Click="eventoClick" Tag="80">Casillero 80</Button>}

Je peux utiliser un champ de chaîne pour ajouter listesou valeursint, date, etc.) puis interpréter et convertir le ficelle dans n'importe quoi.

** J'ai utilisé cette solution, en raison de la nécessité d'ajouter un champ d'identification à un bouton.

1
Sergio Perez