none
Neue Property im Custom Control RRS feed

  • Frage

  • Hallo,

    ich stehe vor einem neuen Problem, bei der Entwicklung eines Custom Controls.

    Das Custom Control ist ein Button, der einige Animationen beinhaltet.

    Aktuell habe ich 2 Button states: 

    (1) Button ist active (IsEnabled = True) d.h. Button kann angeklickt werden und es ist ein MouseOver Event implementiert.

    (2) Button ist inactive (IsEnabled = False). Dieses Event tritt ein, wenn ein Button geklickt wurde. Der Button wird wieder automatisch aktiv, wenn ein anderer Button im Menü geklickt wurde.

    Jetzt habe ich das Problem, dass ich einen drittes Verhalten benötige und zwar inaktiv, also das der Button als inaktiv dargestellt wird.

    Im Prinzip sollen die folgenden states so aussehen:

    (1) Active - Button ist nicht mehr anwählbar (keine mouseover Ereignisse o.a.) und wird als aktiv markiert

    (2) Normal - Button enthält mouseover Ereignisse und kann angeklickt (aktiviert) werden. 

    (3) Inactive - Button wird dunkel und kann nicht mehr angewählt werden, quasi wie (1) nur eine  andere Farbe.

    Jetzt war meine Idee, ein Property wie das IsEnabled zu definieren, weil ich dieses in meinen MultiTrigger abfrage.

    Quasi ein IsActive Property. Hier kann ich dann die States folgendermaßen definieren:

    (1) Active: IsEnabed = True, IsActive = False; 

    (2) Normal: IsEnabled = True, IsActive = True; 

    (3) Inactive: IsEnabled = False; 

    Jetzt de Frage, wie kann ich ein Property definieren, das ich so ansprechen kann, wie das IsEnabled Property aus UIElement?

    Freitag, 25. April 2014 08:26

Antworten

  • Hallo Tom,

    vielen Dank für deine Antwort.

    Ich habe es mir leichter gemacht und das Template nicht von Button (wie vorher) sondern von ToggleButton abgeleitet. Hier kann ich auf die Property IsChecked zugreifen, was dann quasi meinem IsActive entspricht.

    Und es funktioniert wunderbar.

    Freitag, 25. April 2014 12:28

Alle Antworten

  • Hallo,
    ich empfehle dir eine eigene Enumeration dafür anzulegen:

    enum MyButtonStates{
      Active,
      Normal,
      InActive
    }

    Dann kannst du eine eigene Abhängigkeitseigenschaft erstellen, welche den "State" repräsentiert. Nachfolgend das angepasste Visual Studio Snippet für eine Deendency Property:

    //In C#: propdp eingebung und 2mal Tab drücken
    
    public MyButtonStates ButtonState
    {
        get { return (MyButtonStates)GetValue(ButtonStateProperty); }
        set { SetValue(ButtonStateProperty, value); }
    }
    
    // Using a DependencyProperty as the backing store for ButtonState.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ButtonStateProperty =
        DependencyProperty.Register("ButtonState", typeof(MyButtonStates), typeof(MyButton), new PropertyMetadata(MyButtonStates.Normal));

    Diese Eigenschaft kannst du dann auch binden und in Triggern abfragen bzw. in Settern setzen.

    PS: Im XAML kannst du dann den Wert so zuweisen:

    <l:MyButton ButtonState="Active" />

    Also einfach den Namen des Enumerationswerts angeben.

    PPS: Wenn du mit VB.NET arbeitest, in meiner Signatur steht ein Konverter.


    Tom Lambert - C# MVP
    Bitte bewertet- und markiert Beiträge als Antwort. Danke.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets


    Freitag, 25. April 2014 12:06
    Moderator
  • Hallo Tom,

    vielen Dank für deine Antwort.

    Ich habe es mir leichter gemacht und das Template nicht von Button (wie vorher) sondern von ToggleButton abgeleitet. Hier kann ich auf die Property IsChecked zugreifen, was dann quasi meinem IsActive entspricht.

    Und es funktioniert wunderbar.

    Freitag, 25. April 2014 12:28