WPF组合框下拉部分出现在错误的位置

WPF组合框下拉部分出现在错误的位置,wpf,xaml,combobox,Wpf,Xaml,Combobox,我在XAML窗口上放置了几个组合框。当我展开其中任何一个时,下拉部分出现在屏幕的左上角 我使用VisualStudio2008C#Express。我不记得在使用Visual Studio 2008(试用版)时出现过这种现象,尽管我使用的是相同的框架(3.5)。这是WPF中的一个bug(恐怕不是唯一的bug)。它发生在我在加载的事件中打开另一个窗口时,类似于: private void Window_Loaded(object sender, RoutedEventArgs e) { Wi

我在XAML窗口上放置了几个组合框。当我展开其中任何一个时,下拉部分出现在屏幕的左上角

我使用VisualStudio2008C#Express。我不记得在使用Visual Studio 2008(试用版)时出现过这种现象,尽管我使用的是相同的框架(3.5)。

这是WPF中的一个bug(恐怕不是唯一的bug)。它发生在我在加载的事件中打开另一个窗口时,类似于:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    Window selectionWindow = new SelectionWindow();
    bool? result = selectionWindow.ShowDialog();
    if (result == true)
        RecordChanged();
}
我已经找到了一个可行的解决方案。

这似乎是一个bug

解决方法:

使用
Window.Show()
代替自定义逻辑来模拟
ShowDialog()
行为。

昨天,当我试图“调整”窗口大小、形状、颜色并从窗口调用登录对话框时,我开始观察到这一点(以及其他奇怪的行为怪癖)。加载的事件处理程序。我在十几个单独的“MVVM”模式应用程序中都做得很好。昨天,我决定将其从每个应用程序的代码隐藏移到一个统一的代码隐藏基类中,因为预处理在所有这些应用程序中都很常见。当我这样做时,登录对话框中两个组合框中的下拉列表突然出现在屏幕的左上角。我似乎已经通过使用以下技术“解决”了它(您的里程数可能会有所不同):

WindowBaseLoadedHandler是已加载的事件处理程序。LoginDlg是一个WPF应用程序,其对话框包含两个组合框

概述:在我将代码整合到基类的已加载事件处理程序中之后,ComboBox的下拉列表出现在屏幕的左上角。一旦我将逻辑包装到Dispatcher.BeginInvoke调用中,相应的ComboBox行为将返回当前项下面的列表

我怀疑WPF需要应用程序从加载的事件返回来完成布局系统的初始化。这并不能完全解释为什么它以前能奏效,但我将不得不排队等待我的愿望,在未来的某个雨天找到“为什么”,并庆祝今天克服了最新的障碍


无论如何,我希望有人能找到它的用处。

这似乎是WPF中的一个bug。在我的例子中,我试图在另一个窗口的加载事件中打开一个窗口。为了解决这个问题,我设置了一个定时器,然后使用一个委托来打开窗口(不能在定时器事件中打开窗口,因为打开窗口的调用线程必须是STA)

编辑-定时器是没有必要的-没有看到上面的答案只是在调度程序上排队

private delegate void DelegateOpenWindow();
private DelegateOpenWindow m_DelegateOpenWindow;
private Timer loginTimer = new Timer(200);

private void MainWindow1_Loaded(object sender, RoutedEventArgs e)
{
        // create delegate used for asynchronous call
        m_DelegateOpenWindow= new DelegateOpenWindow(this.OpenWindow);
        // start a timer to fire off the open window.
        loginTimer.Elapsed += loginTimer_Elapsed;
        loginTimer.Enabled = true;
}

void loginTimer_Elapsed(object sender, ElapsedEventArgs e)
{
        loginTimer.Enabled = false;
        this.Dispatcher.BeginInvoke(m_DelegateOpenWindow);

}

void OpenWindow()
{
        MyWindow w = new MyWindow();
        w.Owner = this;
        w.ShowDialog();
}

我正在使用最新的.NET4.5和WPF框架,但仍然存在这个问题。我注意到的一件事是,只有当有附加的调试器时才会发生。当调试器未连接时,一切正常。

我在Visual Studio 2019上也遇到了同样的问题。 使用window.Show()会有所帮助,但会破坏您的设计。 解决方案是异步打开窗口

var yourDialog= new YourDialog();
yourDialog.Owner = this;
TaskCompletionSource<bool?> completion = new TaskCompletionSource<bool?>();
this.Dispatcher.BeginInvoke(new Action(() => 
completion.SetResult(yourDialog.ShowDialog())));
bool? result = await completion.Task;

请提供更多详细信息和/或代码,我想解决方法是在单独的消息中打开窗口。也就是说,
加载的
处理程序在
调度程序
上排队等待另一条消息,该消息打开
窗口
+1,告诉我们这是一个bug,-1用来戏弄您有一个错误
var yourDialog= new YourDialog();
yourDialog.Owner = this;
TaskCompletionSource<bool?> completion = new TaskCompletionSource<bool?>();
this.Dispatcher.BeginInvoke(new Action(() => 
completion.SetResult(yourDialog.ShowDialog())));
bool? result = await completion.Task;
public static class AsyncWindowExtension
{
    public static Task<bool?> ShowDialogAsync(this Window self)
    {
        if (self == null) throw new ArgumentNullException("self");

        TaskCompletionSource<bool?> completion = new TaskCompletionSource<bool?>();
        self.Dispatcher.BeginInvoke(new Action(() => completion.SetResult(self.ShowDialog())));

        return completion.Task;
    }
}
await dlgReview.ShowDialogAsync();