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!
<Grid>
<Rectangle x:Name="btnForm" Fill="{TemplateBinding Background}"/>
</Grid>
sollte schon helfen, denke ich.
Hallo ByteDevil,
ich habe den XAML-Code bereits vorher mit gleichlautenden Bindings bestückt, also
{TemplateBinding Background}
Die Property wird aber nicht übernommen. 🤔
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>
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.
👍
Korrekt. Brush != Color
Ein Brush kann vieles sein... zB ein GradientBrush der einen Farbverlauf darstellt.