Laden...

ContentPresenter Foreground ändern von innenliegenden Controls

Letzter Beitrag vor einem Jahr 6 Posts 652 Views
ContentPresenter Foreground ändern von innenliegenden Controls

Hey zusammen,

hab mal wieder eine kleine Frage, die Ihr sicher schnell beantworten könnt.

Ich habe einen Style für einen ToggleButton angelegt. Darin ist ein ControlTemplate mit ControlTemplate.Triggers.

Nun möchte ich einen ToggleButton erstellen, welcher ein Icon enthält. Ich nutze für Icons die mahApp Icons.

                        <ToggleButton x:Name="tglButton" HorizontalAlignment="Right" Background="Transparent" Width="35">
                            <iconPacks:PackIconMaterial Kind="Glasses" Foreground="{StaticResource yellow}" Width="20"/>
                        </ToggleButton>

Dieses Icon hat standardmäßig eine gelbe Farbe.

Nun möchte ich in meinem ControlTemplate.Triggers die Farbe abhängig vom CheckState ändern.

Leider funktioniert der Trick mit TextBlock.Foreground oder auch Control.Foreground nur bei dem Content des ToggleButton selber. Aber nicht bei meinem Icon, welches innerhalb des ToggleButton liegt.

Mein ControlTemplate sieht wie folgend aus:

                <ControlTemplate TargetType="{x:Type ToggleButton}">
                    <Border x:Name="border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="true" CornerRadius="{Binding Source={StaticResource controlCorners}}">
                        <ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter Property="Background" TargetName="border" Value="{StaticResource Button.MouseOver.Background}"/>
                            <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.MouseOver.Border}"/>
                        </Trigger>
                        <Trigger Property="IsPressed" Value="true">
                            <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Pressed.Background}"/>
                            <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Pressed.Border}"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Disabled.Background}"/>
                            <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Disabled.Border}"/>
                            <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Button.Disabled.Foreground}"/>
                        </Trigger>
                        <Trigger Property="IsChecked" Value="true">
                            <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Checked.Background}"/>
                            <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Checked.Border}"/>
                            <Setter Property="TextBlock.Foreground" TargetName="contentPresenter" Value="{StaticResource black}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>

Könnt Ihr mir hier weiterhelfen?

Liebe Grüße und danke schonmal 😃

Hi theSoulT

Ich vermute du musst als Tricker-Target das 'PackIconMaterial' nehmen und nicht den Button.

Gruß
Alf

Aber ich hab das ControlTemplate in einer extra Style Datei. Die kennt das PackIcon direkt ja gar nicht. Dafür ist ja der ContentPresenter dachte ich..

<iconPacks:PackIconMaterial Kind="Glasses" Foreground="{StaticResource yellow}" Width="20"/>

Da wird doch die Farbe für das Icon gesetzt. Folglich müsstest du die Foreground-Eigenschaft für PackIconMaterial anpassen.

Vielleicht könntest du bei deinem ToggleButton-Style einen Trigger einbauen, der den Foreground für das PackIcon anpasst, wenn der Foreground vom ToggleButton gesetzt wird. Nur eine Idee, bin grade nicht sonderlich tief drin, in dem Thema.

Ja aber der Code steht in einer anderen Datei. Und ja die Foreground Eigenschaft muss geändert werden.

Ich versuch es jetzt mal mit einem UserControl. Damit sollte es dann eigentlich klappen.

Ich hab mal ein bisschen rumprobiert:

        <Style TargetType="iconPacks:PackIconMaterial">
            <Style.Triggers>
                <DataTrigger Value="True" Binding="{Binding Path=IsChecked, 
                    RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ToggleButton}}}">
                    <Setter Property="Foreground" Value="Green" />
                </DataTrigger>

                <DataTrigger Value="False" Binding="{Binding Path=IsChecked, 
                    RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ToggleButton}}}">
                    <Setter Property="Foreground" Value="Blue" />
                </DataTrigger>
            </Style.Triggers>
        </Style>