2017-07-20 3 views
0

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?

+0

@Clemens Wie würden Sie es stattdessen tun? –

+2

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

+0

Verwenden Sie Style und DataTemplate. – Coding4Fun

Antwort

3

Sie haben in Ihrem DependencyProperty.Register Aufruf ungültig Argument bekommen, nämlich der dritte Parameter Type ownerType sollte die Art zeigen, dass die Abhängigkeitseigenschaft (der Eigentümer-Typ) und seinen Wert nicht Typ (die Type propertyType durch den zweiten Parameter angegeben wird) registriert . Der Besitzertyp sollte auch von DependencyObject stammen. Jetzt übergeben Sie typeof(Theme) als der Besitzertyp (was es nicht ist), daher erhalten Sie den Fehler.

Was sollten Sie tun, ist Pass typeof(BugButton) als dritter Parameter (BugButton ist die eigentliche Registrierung Typ) statt:

public static readonly DependencyProperty ButtonThemeProperty = 
    DependencyProperty.Register(
     "ButtonTheme", 
     typeof(Theme), 
     typeof(BugButton), 
     new PropertyMetadata(Theme.Black, new PropertyChangedCallback(ValueChanged))); 

Auch der Aufruf von ValueChanged im ButtonTheme Setter redundant ist. Es wird vom Framework aufgerufen, wenn SetValue(...) aufgerufen wird, wenn sich der Wert tatsächlich geändert hat.

+1

Schön, danke! Aber der Button ändert sich nicht, wenn ich das Programm starte. –

+1

@TomUnger Sie haben 'Background =" White "' nach 'ButtonTheme =" White "gesetzt, was erwarten Sie? – Clemens

+1

@Clemens Guter Punkt ... -.- –

Verwandte Themen