Parameter an eine Vorlage
-
06-07-2019 - |
Frage
Sagen, dass ich einen Knopf mit abgerundeten Ecken definiert haben.
<Style x:Key="RoundButton" TargetType="Button">
<!-- bla bla -->
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border CornerRadius="0,5,5,0" />
<!-- bla bla -->
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
ich es möglich, dass der Benutzer dieser Taste kann die Corner angeben? Kann ich ein Template benutzen? Aber wo soll ich binden? (Tag?)
Lösung
Um eine TemplateBinding
zu verwenden, muss es eine Eigenschaft auf dem Steuerelement mit Vorlagen sein (Button
, in diesem Fall). Button
keine CornerRadius
oder entsprechende Eigenschaft haben, so dass Ihre Optionen sind:
- Fest Code der Wert in der Vorlage
- Hijack eine andere Eigenschaft (wie
Tag
), um diese Informationen zu speichern. Das ist schneller, aber es fehlt die Sicherheit gibt, ist schwieriger zu pflegen, und verhindert, dass andere Verwendungen dieser Eigenschaft. - Subclass
Button
und fügen Sie den propery Sie benötigen, geben Sie dann eine Vorlage für diese Unterklasse. Das dauert ein wenig länger, aber ergibt sich ein viel schöneres Erlebnis für die Verbraucher von Ihrer Kontrolle.
Andere Tipps
Neben Kent Vorschläge, können Sie auch eine angeschlossene Eigenschaft erstellen, die Corner auf der Schaltfläche zu definieren, und binden an diese Eigenschaft in der Vorlage
Der Tastentyp nicht über eine Eigenschaft für Corner, so dass dieser Templating nicht möglich sein wird. Ich denke, der einfachste Weg, eine neue Klasse zu schaffen, die von Knopf erbt und eine neue Abhängigkeitseigenschaft für die Corner hinzufügen. Wie folgt aus:
using System.Windows;
using System.Windows.Controls;
namespace WpfApplication3
{
public class RoundedButton:Button
{
public CornerRadius CornerRadius
{
get { return (CornerRadius) GetValue(CornerRadiusProperty); }
set { SetValue(CornerRadiusProperty, value); }
}
public static readonly DependencyProperty CornerRadiusProperty =
DependencyProperty.Register("CornerRadius", typeof (CornerRadius),
typeof (RoundedButton), new UIPropertyMetadata());
}
}
In XAML können Sie es verwenden mögen:
<Local:RoundedButton
Style="{DynamicResource RoundButton}"
Width="64" Height="32"
Content="Hello"
CornerRadius="1,5,10,5"
Background="#FF9CFFD5" />
Eine Vorlage an den Corner Bindung wird nun ohne Probleme funktionieren.