20 Stimmen

Einen StyleSelector für eine Schaltfläche verwenden

Ich habe eine Anforderung, um den Stil einer Schaltfläche basierend auf einem Wert in den Daten zu ändern. Es sieht aus wie ein StyleSelector würde perfekt funktionieren, aber es scheint nicht eine Möglichkeit, eine für eine Schaltfläche festgelegt werden.

Gibt es eine Möglichkeit, einen Schaltflächenstil dynamisch aus Daten festzulegen? Vielleicht sogar ein reiner XAML-Ansatz?

40voto

Skrymsli Punkte 4877

Eine allgemeinere Methode, um das Gleiche zu erreichen:

SomeView.xaml

<UserControl>
  <UserControl.Resources>
    <converters:BooleanToStyleConverter x:Key="MyButtonStyleConverter" 
      TrueStyle="{StaticResource AmazingButtonStyle}" 
      FalseStyle="{StaticResource BoringButtonStyle}"/>
  </UserControl.Resources>
  <Grid>
    <Button Style={Binding IsAmazingButton, Converter={StaticResource MyButtonStyleConverter}}/>
  </Grid>
</UserControl>

BooleanToStyleConverter.cs

public class BooleanToStyleConverter : IValueConverter
{
    public Style TrueStyle { get; set; }
    public Style FalseStyle { get; set; }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is bool && (bool) value)
        {
            return TrueStyle;
        }
        return FalseStyle;
    }

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

Dieser Konverter funktioniert in jeder Ansicht mit jeder Art von Steuerelement mit jedem Stil, den Sie wählen, solange Sie an eine boolesche Eigenschaft in Ihrem ViewModel binden, um den Stilwechsel zu steuern. Es ist leicht, ihn an andere Bindungsanforderungen anzupassen. Dies funktioniert in einem DataTemplate als gut.

24voto

Fredrik Hedblad Punkte 81655

Sie könnten Ihre Button Styles in einem Resource Dictionary und binden den Style für die Button und einen Konverter verwenden

ButtonStyles.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style x:Key="ButtonStyle1" TargetType="Button">
        <Setter Property="Background" Value="Green"/>
        <Setter Property="FontSize" Value="12"/>
    </Style>
    <Style x:Key="ButtonStyle2" TargetType="Button">
        <Setter Property="Background" Value="Red"/>
        <Setter Property="FontSize" Value="14"/>
    </Style>
</ResourceDictionary>

Dann für die Button die diese Anforderung enthält, binden Sie Style zur Immobilie von Interesse

<Button ...
        Style="{Binding Path=MyDataProperty,
                        Converter={StaticResource ButtonStyleConverter}}"/>

Und im Konverter laden Sie das ButtonStyles Resource Dictionary und geben den gewünschten Style basierend auf dem Wert

public class ButtonStyleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Uri resourceLocater = new Uri("/YourNameSpace;component/ButtonStyles.xaml", System.UriKind.Relative);
        ResourceDictionary resourceDictionary = (ResourceDictionary)Application.LoadComponent(resourceLocater);
        if (value.ToString() == "Some Value")
        {
            return resourceDictionary["ButtonStyle1"] as Style;
        }
        return resourceDictionary["ButtonStyle2"] as Style;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X