AvaloniaUtils / DialogHost.Avalonia

AvaloniaUI control that provides a simple way to display a dialog with information or prompt the user when information is needed
MIT License
228 stars 15 forks source link

The control already has a visual parent #22

Closed mysteryx93 closed 1 year ago

mysteryx93 commented 1 year ago

Showing a Dialog with this; clicking away to close it, opening it a 2nd time, closing it again. On 3rd open, it throws an exception.

public async Task<object?> ShowDialogHostAsync(Control? owner, DialogHostSettings settings)
{
    var host = owner?.FindDescendantOfType<DialogHostAvalonia.DialogHost>()!;
    var closingHandler = settings.ClosingHandler ?? ((_, _) => { });
    return await DialogHostAvalonia.DialogHost.Show(settings.ContentViewModel!, host, closingHandler);
}
System.InvalidOperationException: The control already has a visual parent.
   at Avalonia.Visual.ValidateVisualChild(Visual c) in /_/src/Avalonia.Base/Visual.cs:line 646
   at Avalonia.Visual.<>c.<.ctor>b__19_0(Visual visual) in /_/src/Avalonia.Base/Visual.cs:line 145
   at Avalonia.Collections.AvaloniaList`1.InsertRange(Int32 index, IEnumerable`1 items) in /_/src/Avalonia.Base/Collections/AvaloniaList.cs:line 387
   at Avalonia.Controls.Panel.ChildrenChanged(Object sender, NotifyCollectionChangedEventArgs e) in /_/src/Avalonia.Controls/Panel.cs:line 127
   at Avalonia.Collections.AvaloniaList`1.NotifyAdd(T item, Int32 index) in /_/src/Avalonia.Base/Collections/AvaloniaList.cs:line 700
   at Avalonia.Collections.AvaloniaList`1.Add(T item) in /_/src/Avalonia.Base/Collections/AvaloniaList.cs:line 205
   at DialogHostAvalonia.DialogOverlayPopupHost.Show()
   at DialogHostAvalonia.DialogOverlayPopupHost.set_IsOpen(Boolean value)
   at DialogHostAvalonia.DialogHost.IsOpenPropertyChangedCallback(DialogHost dialogHost, Boolean newValue)
   at DialogHostAvalonia.DialogHost.set_IsOpen(Boolean value)
   at DialogHostAvalonia.DialogHost.ShowInternal(Object content, DialogOpenedEventHandler openedEventHandler, DialogClosingEventHandler closingEventHandler)
   at HanumanInstitute.MvvmDialogs.Avalonia.DialogHost.DialogHostApi.ShowDialogHostAsync(Control owner, DialogHostSettings settings) in /home/hanuman/GitHub/HanumanInstitute.MvvmDialogs/src/MvvmDialogs.Avalonia.DialogHost/DialogHostApi.cs:line 11
megazyz commented 1 year ago

workaround: set DialogHost.DisableOpeningAnimation to true

mysteryx93 commented 1 year ago

yep that works. Is that a bug in Avalonia or DialogHost?

megazyz commented 1 year ago

I am not sure. The closing animation should set DialogOverlayPopupHost.IsActuallyOpen to False in the last step, but for some reason it doesn't, which is causing the problem.

SKProCH commented 1 year ago

Hhhmm, seems like this is a DialogHost bug, i'll try to investigate this.

SKProCH commented 1 year ago

Should be fixed with 0.7.0-preview5.

// I also should consider to rethink current implementation of DialogHost showing strategy... Someday...