Laden...

ControlTemplate: Fill-Property an TargetType binden?

Erstellt von Svenson85 vor 3 Jahren Letzter Beitrag vor 3 Jahren 440 Views
S
Svenson85 Themenstarter:in
3 Beiträge seit 2021
vor 3 Jahren
ControlTemplate: Fill-Property an TargetType binden?

Guten Tag liebe C#-Gemeinde,
ich bin Hobbyentwickler. Ich habe etliche Jahre mit WinForms gearbeitet. Künftig möchte ich WPF-Anwendungen entwickeln. Konkret bin ich gerade dabei, mir die elementaren Grundlagen hierzu zu erarbeiten. Hierzu habe ich mir das Buch C# 8 mit VS 2019 von Kühnel besorgt, weil es auch als Nachschlagewerk taugt.

Zu Übungszwecken versuche mir einen eigenen Button zu bauen. Hier der simple XAML-Code hierzu:



 <ControlTemplate x:Key="myBtn" TargetType="Button">

            <Grid>

                <Rectangle x:Name="btnForm">
                    <Rectangle.Fill>
                        <SolidColorBrush Color="{Binding ...}"/>
                    </Rectangle.Fill>    
                </Rectangle>
                
            </Grid>

</ControlTemplate>


Die Hintergrundfarbe des Rechtecks (Rectangle) soll nun an die Property vom "Button" gebunden werden.


<Button Margin="5" Width="200" Height="60"
                Template="{StaticResource myBtn}"
                x:Name="NewButton" Background="#FF9C9C9C" /> 

Was ist nötig, um die Property SolidColorBrush an diesen Wert zu binden?
Allgemeiner formuliert: Wie kann ich auf die Properties des TargetType zugreifen?

Ich danke euch!

132 Beiträge seit 2013
vor 3 Jahren
<Grid>
    <Rectangle x:Name="btnForm" Fill="{TemplateBinding Background}"/>
</Grid>

sollte schon helfen, denke ich.

S
Svenson85 Themenstarter:in
3 Beiträge seit 2021
vor 3 Jahren

Hallo ByteDevil,
ich habe den XAML-Code bereits vorher mit gleichlautenden Bindings bestückt, also


{TemplateBinding Background}

Die Property wird aber nicht übernommen. 🤔

132 Beiträge seit 2013
vor 3 Jahren

Magst du mal mehr code posten? Hab es eben ausprobiert und es funktioniert bei mir genau so:

<Button Width="100" Height="20" Background="Red">
    <Button.Template>
        <ControlTemplate TargetType="{x:Type Button}">
            <Grid>
                <Rectangle Fill="{TemplateBinding Background}"/>
            </Grid>
        </ControlTemplate>
    </Button.Template>
</Button>

Bzw auch so:


<Window>
....
    <Grid>
        <Grid.Resources>
            <ControlTemplate x:Key="myBtn" TargetType="{x:Type Button}">
                <Grid>
                    <Rectangle Fill="{TemplateBinding Background}"/>
                </Grid>
            </ControlTemplate>
        </Grid.Resources>

        <Button Width="100" Height="20" Template="{StaticResource myBtn}"
                Background="Red"/>
    </Grid>
</Window>
S
Svenson85 Themenstarter:in
3 Beiträge seit 2021
vor 3 Jahren

Hey,
klar:


<Window x:Class="WpfBtnTemplate.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfBtnTemplate"
        mc:Ignorable="d"
        Title="MainWindow" 
        Height="450" 
        Width="350">

    <Window.Resources>
        <ControlTemplate x:Key="myBtn" TargetType="Button">
            
            <Rectangle>
                <Rectangle.Fill>
                    <SolidColorBrush Color="{TemplateBinding Background}"></SolidColorBrush>
                </Rectangle.Fill>
            </Rectangle>
           
        </ControlTemplate>
    </Window.Resources>

    <Grid>

        <Button Template="{StaticResource myBtn}" 
                Background="red" 
                Width="200"
                Height="30"></Button>
    </Grid>
</Window>

Deine Version funktioniert, obiges Beispiel nicht. Ich habe keine Idee, warum obiger Code nicht funktioniert.

Edit:
Beim genaueren Hinsehen fällt auf, dass die Property Background vom Typ Brush ist, während Color vom Typ Color ist. Möglicherweise ist eine Typenumwandlung erforderlich, die Schreibweise:


Fill="{TemplateBinding Background}"

funktioniert tadellos.

👍

132 Beiträge seit 2013
vor 3 Jahren

Korrekt. Brush != Color

Ein Brush kann vieles sein... zB ein GradientBrush der einen Farbverlauf darstellt.