Frage

Ich habe eine Control die die gleiche Farbe in mehreren Elementen verwendet. Auf bestimmte Auslöser (z OnMouseOver) Ich möchte, dass die Farbe ändern. Soweit ich sehen kann, ich habe einen Setter für jedes Element zu definieren, seine Farbe zu ändern. Gibt es eine Möglichkeit, eine gemeinsam genutzte Ressource in der Vorlage zu verweisen, die alle enthaltenen Elemente zugreifen können, und die durch einen Trigger geändert werden kann, so habe ich nicht jedes einzelne Element zu adressieren?

Hier ist ein (aus) Beispiel:

<ControlTemplate x:Key="myTemplate" TargetType="{x:Type Button}">
  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition/>
      <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Ellipse Fill="red" Grid.Column="0"/>
    <Ellipse Fill="red" Grid.Column="1"/>
    <ContentPresenter Grid.ColumnSpan="2" VerticalAlignment="Center"/>
 </Grid>
</ControlTemplate>

Wenn das Steuerelement deaktiviert ist, möchte ich die Ellipsen grau, sein, ohne ausdrücklich von ihnen beide Einstellung , z.B. I nicht schreiben möchten

<Trigger Property="IsEnabled" Value="False">
  <Setter TargetName="_ellipse1" Property="Fill" Value="Grey"/>
  <Setter TargetName="_ellipse2" Property="Fill" Value="Grey"/>
</Trigger>

aber legen Sie die Farbe der beiden Ellipsen mit nur ein Setter.

War es hilfreich?

Lösung

Setzen Sie den Trigger auf einen Stil für die Ellipsen (ellipsi?) Anstelle der Taste. IsEnabled pflanzt sich nach unten, wenn Sie IsEnabled = false auf den Button gesetzt.

<ControlTemplate x:Key="myTemplate" TargetType="{x:Type Button}">
    <ControlTemplate.Resources>
        <Style TargetType="{x:Type Ellipse}">
            <Setter Property="Fill" Value="Red" />
            <Style.Triggers>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter Property="Fill" Value="Gray" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </ControlTemplate.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Ellipse Grid.Column="0"/>
        <Ellipse Grid.Column="1"/>
        <ContentPresenter Grid.ColumnSpan="2" VerticalAlignment="Center"/>
    </Grid>
</ControlTemplate>

Andere Tipps

Ich denke, der beste Weg, dies zu tun, mit einem Wertwandler ist. Dann können Sie einen unordentlichen Auslöser ganz vermeiden. Hier ist dein Beispiel, aber mit einem Wandler hinzugefügt.

<Window.Resources>
  <local:EnabledToColorConverter x:Key="enabledToColorConverter"/>
  <ControlTemplate x:Key="myTemplate" TargetType="{x:Type Button}">
    <Grid>
      <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
      </Grid.ColumnDefinitions>
      <Ellipse Name="_ellipse1" Fill="{TemplateBinding IsEnabled, Converter={StaticResource enabledToColorConverter}}" Grid.Column="0"/>
      <Ellipse Name="_ellipse2" Fill="{TemplateBinding IsEnabled, Converter={StaticResource enabledToColorConverter}}" Grid.Column="1"/>
      <ContentPresenter Grid.ColumnSpan="2" VerticalAlignment="Center"/>
    </Grid>
  </ControlTemplate>
</Window.Resources>

<StackPanel>
  <Button Template="{StaticResource myTemplate}">Enabled Button</Button>
  <Button Template="{StaticResource myTemplate}" IsEnabled="False">Disabled Button</Button>
</StackPanel>

Und hier ist der Konverter:

public class EnabledToColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool isEnabled = (bool)value;
        return isEnabled ?
            Brushes.Red :
            Brushes.Gray;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top