Wie zeigt man ein benutzerdefiniertes UserControl als Dialog an?

71

Wie wird eine benutzerdefinierte UserControlDatei in C # / WPF (.NET 3.5) als Dialogfeld angezeigt ?

Taylor Leese
quelle

Antworten:

148

Platzieren Sie es in einem Fenster und rufen Sie Window.ShowDialog auf . (Fügen Sie außerdem Verweise auf: PresentationCore, WindowsBase und PresentationFramework hinzu, falls Sie dies noch nicht getan haben.)

private void Button1_Click(object sender, EventArgs e)
{
        Window window = new Window 
        {
            Title = "My User Control Dialog",
            Content = new MyUserControl()
        };

        window.ShowDialog();
}
user7116
quelle
16
Ich fand auch, dass das Festlegen von SizeToContent = SizeToContent.WidthAndheight und ResizeMode = ResizeMode.NoResize hilfreich war, damit das Benutzersteuerelement die Größe definieren kann.
Taylor Leese
4
Wie können wir die this.Close()Funktion für diesen UserControl-Dialog verwenden?
Manikandan Sethuraju
4
private void btnClose_Click (Objektabsender, RoutedEventArgs e) {var parent = this.Parent as Window; if (parent! = null) {parent.DialogResult = true; parent.Close (); }}
Ashish Singh
1
Wenn Sie möchten, dass das Dialogfenster oben angezeigt wird und beim Klicken auf ein anderes Fenster "blinkt", legen Sie den Eigentümer fest. Owner = Application.Current.MainWindow
Scott Solmer
13
Window window = new Window
            {
                Title = "My User Control Dialog",
                Content = new OpenDialog(),
                SizeToContent = SizeToContent.WidthAndHeight,
                ResizeMode = ResizeMode.NoResize
            };
            window.ShowDialog();

Hat wie eine Magie für mich gearbeitet. Kann es als modaler Dialog gemacht werden?


Ans: ShowDialog selbst machen es als Modal Dialog .. ...

WpfBegnner
quelle
SizeToContent ist sehr nützlich. Vielen Dank.
Honzakuzel1989
2

Soweit ich weiß, kannst du das nicht. Wenn Sie es in einem Dialogfeld anzeigen möchten, ist dies vollkommen in Ordnung. Erstellen Sie einfach ein neues Fenster, das nur Ihr UserControl enthält, und rufen Sie ShowDialog () auf, nachdem Sie eine Instanz dieses Fensters erstellt haben.

BEARBEITEN: Die UserControlKlasse enthält keine Methode ShowDialog. Was Sie also versuchen, ist tatsächlich nicht möglich.

Dies ist jedoch:

private void Button_Click(object sender, RoutedEventArgs e){
    new ContainerWindow().ShowDialog();
}
Mark Carpenter
quelle
1
namespace System.Window.Form
{
    public static class Ext
    {
        public static DialogResult ShowDialog(this UserControl @this, string title)
        {
            Window wind = new Window() { Title = title, Content = @this };
            return wind.ShowDialog();
        }
    }
}

Die Verwendung ist möglicherweise so einfach wie UserControlInstance.ShowDialog (). Eine besser angepasste Implementierung wäre, die Window-Klasse zu erweitern und sie mithilfe des Designers und des Codes anzupassen, um alle Funktionen zu erhalten.

gwasterisk
quelle
Schönes Beispiel, nur für den Fall von WPF (System.Windows.Window.ShowDialog ()) Der Rückgabetyp sollte bool sein? (Nullable Type)
Ashish Singh
1

Ich weiß, dass dies für .net 3.5 ist, aber hier ist eine praktikable Lösung für .net 2.0

  MyUserControl myUserControl= new MyUserControl();

  Form window = new Form
  {
    Text = "My User Control",
    TopLevel = true,
    FormBorderStyle = FormBorderStyle.Fixed3D, //Disables user resizing
    MaximizeBox = false,
    MinimizeBox = false,
    ClientSize = myUserControl.Size //size the form to fit the content
  };

  window.Controls.Add(myUserControl);
  myUserControl.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
  window.ShowDialog();
Darrel K.
quelle
0

Sie können auch MaterialDesignThemes.Wpf verwenden (herunterladbar auf NuGet, .NET 4.5+). Dann können Sie einfach tun:

{
    var view = new YourUserControl();
    var result = await DialogHost.Show(view, "RootDialog", ClosingEventHandler);
}

private void ClosingEventHandler(object sender, DialogClosingEventArgs eventArgs)
{ }  //Handle Closing here
Codigo
quelle
-1

Wenn die Antwort von 'sixlettervariables' so geändert wird, funktioniert es

private void button1_Click ( object sender, RoutedEventArgs e )                  
{
    Window window = new Window
    {
        Title = "My User Control Dialog",
        Content = new UserControl ( ),
        Height = 200,  // just added to have a smaller control (Window)
        Width = 240
    };

    window.ShowDialog ( );
}
user474051
quelle
14
Du hast es vergessen Background = Brushes.Purple; Ohne das geht es nicht.
Lee Louviere