gpt4 book ai didi

wpf - 对话框实现失败,已经是另一个元素的逻辑子元素

转载 作者:行者123 更新时间:2023-12-01 12:57:36 26 4
gpt4 key购买 nike

我正在尝试在 WPF + PRISM + MVVM 应用程序中实现对话窗口。现在我设法创建了示例服务,每个模块都能够使用该服务在窗口中显示任何 View ,但问题是非常不寻常的,无法使其工作。

这里是窗口服务的契约。

public interface IUiDialogueService : IDisposable
{
void Show<TView>(TView view) where TView : IViewModel;
}

public class UiDialogueService : IUiDialogueService, IDisposable
{
private Window _dialogueWindow;

#region Implementation of IUiDialogueService

public void Show<TView>(TView view) where TView : IViewModel
{
_dialogueWindow = new Window
{
SizeToContent = SizeToContent.WidthAndHeight,
ResizeMode = ResizeMode.NoResize,
ShowInTaskbar = false,
Content = view.View
};
_dialogueWindow.ShowDialog();
_dialogueWindow = null;

}
}

下面是我如何从模块访问我的窗口服务。

    private void OnStartWizard()
{
_dialogueService.Show(ServiceLocator.Current
.GetInstance<IOrgManagementOrganizatioSetupViewViewModel>());
}

当我第一次打开窗口时一切正常,但在我关闭它并在窗口内打开相同或其他 View 后我在异常后恢复

Specified element is already the logical child of another element. Disconnect it first.

此异常由以下代码抛出。

        _dialogueWindow = new Window
{
SizeToContent = SizeToContent.WidthAndHeight,
ResizeMode = ResizeMode.NoResize,
ShowInTaskbar = false,
Content = view.View
};

谁能解释这里出了什么问题,有没有更好的方法在 MVVM 架构中获取子(对话)窗口?

最佳答案

尝试在 Show 的最后一行之前添加以下代码:

_dialogueWindow.Content = null;

Show 现在应该是这样的:

public void Show<TView>(TView view) where TView : IViewModel
{
_dialogueWindow = new Window
{
SizeToContent = SizeToContent.WidthAndHeight,
ResizeMode = ResizeMode.NoResize,
ShowInTaskbar = false,
Content = view.View
};
_dialogueWindow.ShowDialog();
_dialogueWindow.Content = null;
_dialogueWindow = null;
}

关于wpf - 对话框实现失败,已经是另一个元素的逻辑子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8847133/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com