Ich versuche, eine benutzerdefinierte Button
mit der Eigenschaft ButtonTheme
zu erstellen. Dies sollte für den Hintergrund der Schaltfläche verantwortlich sein. Ich möchte dies im XAML-Code einstellen.WPF benutzerdefinierte Schaltfläche und DependencyObject
My Custom Button-
public enum Theme
{
Black,
White
}
public class BugButton : Button
{
public string Email { get; set; }
public string Version { get; set; }
public Produkte Product { get; set; }
public static readonly DependencyProperty ButtonThemeProperty = DependencyProperty.Register("ButtonTheme", typeof(Theme), typeof(Theme), new PropertyMetadata(Theme.Black, new PropertyChangedCallback(ValueChanged)));
public Theme ButtonTheme
{
get
{
return (Theme)GetValue(ButtonThemeProperty);
}
set
{
SetValue(ButtonThemeProperty, value);
ValueChanged(this, new DependencyPropertyChangedEventArgs(ButtonThemeProperty, value, value));
}
}
public BugButton()
{
}
private static void ValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var control = d as BugButton;
var brush = new ImageBrush();
if ((Theme)e.NewValue == Theme.White)
{
brush.ImageSource = new BitmapImage(new Uri("pack://application:,,,/BugReport;component/Images/bug.png"));
control.Background = brush;
}
else
{
brush.ImageSource = new BitmapImage(new Uri("pack://application:,,,/BugReport;component/Images/bug_black.png"));
control.Background = brush;
}
}
protected override void OnClick()
{
base.OnClick();
BugWindow bug = new BugWindow(Email, Version, Product);
bug.ShowDialog();
}
public void SetParameters(string aEmail, string aVersion, Produkte aProduct)
{
Email = aEmail;
Version = aVersion;
Product = aProduct;
}
}
, wie ich es in der XAML-
<BugReport:BugButton x:Name="B_bug" ButtonTheme="White" Margin="0,8,8,0" Style="{StaticResource HeaderButtonHoverMakeover}" Foreground="White" HorizontalAlignment="Right" Width="25" Height="25" VerticalAlignment="Top" Background="White"/>
Das Problem The type "Theme" must be derived from "DependencyObject".
So schätze anrufen möchten ich es hat zu sehen wie folgt aus:
public class BugButton : DependencyObject
Aber das funktioniert nicht mit dem, was ich vom Button müssen aus. Was fehlt mir hier?
@Clemens Wie würden Sie es stattdessen tun? –
Dies ist überhaupt nicht notwendig, da der PropertyChangedCallback von SetValue aufgerufen wird (weil Sie ihn im Registeraufruf an die Eigenschaftenmetadaten übergeben haben). Als eine weitere Anmerkung sollten Sie auch 'var control = (BugButton) d;' anstelle von 'var control = d als BugButton 'schreiben, da dies zu einer InvalidCastException anstelle einer NullReferenceException führen würde, falls es kein BugButton ist. – Clemens
Verwenden Sie Style und DataTemplate. – Coding4Fun