2017-03-28 3 views
0

ich meine eigene MessageBox mit meinem eigenen Enum MessageBoxButton erstellt haben:implizite Umwandlung für ENUM-Wert

public enum MyMessageBoxButton 
{ 
    OK = MessageBoxButton.OK, 
    OKCancel = MessageBoxButton.OKCancel, 
    YesNoCancel = MessageBoxButton.YesNoCancel, 
    YesNo = MessageBoxButton.YesNo, 
    NowLaterCancel = 5, 
} 

Wie Sie sehen können, ist es wie System.Windows.MessageBoxButton mit 1 Wert mehr.

Für meine Klasse MyMessageBox habe ich die Funktion:

public static MessageBoxResult Show(String caption, String message, MyMessageBoxButton button, MessageBoxImage icon) 
{ 
    ... 
} 

Gibt es eine Möglichkeit Show mit MessageBoxButton zu nennen und werfen implizit den Wert auf einen MyMessageBoxButton?

+0

Kann ich eine Änderung an Ihrer Lösung vorschlagen? Sie haben eine Aufzählung, die die möglichen Kombinationen von Schaltflächen auflistet. Sie haben jedoch einen einzelnen Wert für mehrere Varianten erstellt. Dies ist unflexibel. Ich würde Folgendes vorschlagen: None = 0, OK = 1, Yes = 2, No = 4, Cancel = 8, Later = 16 Auf diese Weise können Sie mit einer bitweisen Operation trainieren, welche Tasten verfügbar sind. 1 + 8 = 9 (OK, Abbrechen) 2 + 4 = 6 (Ja, Nein) usw. –

+0

Haben Sie 'switch/case' probiert? Was du Casting * nennst * ist tatsächlich Mapping *, aber du musst etwas für diesen zusätzlichen Wert tun, nicht wahr? – Sinatr

+0

Ich habe versucht, Lösung von itsme86 zur Verfügung stellen und es funktioniert. Wie ich nicht mitbekomme, sollte ich einen 'try/catch' verwenden –

Antwort

1

Sie können einen Konverter Methode erstellen, die eine MessageBoxButtons zu einem MyMessageBoxButton umwandelt, eine Überlastung Ihrer Show Methode erstellen, die eine MessageBoxButtons, und dann in dieser Methode verwendet würden Sie die Konvertierung tun und Ihre vorhandenen Show Methode aufrufen.

Da Sie nicht über ENUM-Werte für alle Artikel aus (wie AbortRetryIgnore), müssen Sie die Tastenkombination entscheiden zu zeigen, wenn jemand einer von denen, wählt:

public static MyMessageBoxButton ConvertToMyMessageBoxButton(MessageBoxButtons input) 
{ 
    MyMessageBoxButton result; 

    switch (input) 
    { 
     case MessageBoxButtons.OK: 
      result = MyMessageBoxButton.OK; 
      break; 
     case MessageBoxButtons.OKCancel: 
      result = MyMessageBoxButton.OKCancel; 
      break; 
     case MessageBoxButtons.RetryCancel: 
      result = MyMessageBoxButton.NowLaterCancel; 
      break; 
     case MessageBoxButtons.YesNo: 
      result = MyMessageBoxButton.YesNo; 
      break; 
     case MessageBoxButtons.YesNoCancel: 
      result = MyMessageBoxButton.YesNoCancel; 
      break; 
     default: 
      // AbortRetryIgnore will fall through to this 
      result = MyMessageBoxButton.OKCancel; 
      break; 
    } 

    return result; 
} 

Dann würden Sie die verwenden Convert Verfahren in einer Überlastung Ihrer Show Methode, um die Konvertierung zu tun und rufen Sie Ihren ursprünglichen Show:

public static MessageBoxResult Show(String caption, String message, 
    MessageBoxButtons button, MessageBoxImage icon) 
{ 
    return Show(caption, message, ConvertToMyMessageBoxButton(button), icon); 
} 
+0

Eigentlich funktioniert es mit einem Cast, aber ich werde auf Ihre Lösung umstellen, wartbarer. –

0

Sie können eine Überlastung für Show() erstellen, die ein MessageBoxButton und wirft es in sich:

public static MessageBoxResult Show(String caption, String message, MessageBoxButton button, MessageBoxImage icon) 
{ 
    return Show(caption, message, (MyMessageBoxButton)(int)button, icon); 
} 

nicht sicher, ob der erste Guss zu int notwendig ist. Probieren Sie es ohne zuerst aus.

Beachten Sie, dass hierbei die Werte für beide enums übereinstimmen. Beispielsweise muss MessageBoxButton.YesNoCancel 3 sein, wie es für MyMessageBoxButton ist.

+0

Cast ist erforderlich. Da C# implizite Konvertierung nicht erlaubt –

+2

Dies ist so fehleranfällig.Ich würde wirklich eine Methode zur Verfügung stellen, die einen 'MyMessageBoxButton' für einen gegebenen' MessageBoxButton' zurückgibt, der einen 'switch ... case' verwendet. –

+0

Ich habe es mit einer neuen show-Methode versucht: 'return Show (Titel, Nachricht, (MessageBoxSVButton) -Taste, Symbol);' und es scheint zu funktionieren. Ich verstehe nicht, was ich mit einem 'switch/case' machen soll. –

Verwandte Themen