Wpf 组合框下拉事件触发父窗口Z索引更改

Wpf 组合框下拉事件触发父窗口Z索引更改,wpf,Wpf,我对WPF业务线应用程序原型有一个问题,我不知道从哪里开始调试 我的主窗口(A)使用dialog.Show()打开一个“对话框”窗口。子窗口(B)上有一个组合框 单击组合框(展开并显示所有选项)时,整个第二个窗口(B)将隐藏,但组合框中出现的dropdownlist除外。组合框不在那里,窗口不在那里。除了dropdownlist和它后面的主窗口之外,没有其他内容。如果我单击主窗口,则焦点将再次设置为窗口B,并按其应显示(因为我将窗口B的所有者设置为窗口A) 更有趣的是,这个bug并不一致。它可能

我对WPF业务线应用程序原型有一个问题,我不知道从哪里开始调试

我的主窗口(A)使用dialog.Show()打开一个“对话框”窗口。子窗口(B)上有一个组合框

单击组合框(展开并显示所有选项)时,整个第二个窗口(B)将隐藏,但组合框中出现的dropdownlist除外。组合框不在那里,窗口不在那里。除了dropdownlist和它后面的主窗口之外,没有其他内容。如果我单击主窗口,则焦点将再次设置为窗口B,并按其应显示(因为我将窗口B的所有者设置为窗口A)

更有趣的是,这个bug并不一致。它可能出现在我使用该应用程序的20次中的1次,当它开始出现时,它可以连续出现几次,然后再次停止

可能与此相关的是,我认为我有时在MessageBox上也有相同的bug。当仅主窗口(a)显示时,从viewmodel使用MessageBox.Show()时,该框会偶尔出现在主窗口后面,使用户看不见

我的应用程序使用的是GalaSoft MvvmLight(如果这可能与它有关的话)和许多telerik组件。除此之外,我不确定提供什么数据。我认为没有人能根据这些信息告诉我问题的根源,但是你会从哪里开始寻找问题

更新: 好消息!我已经隔离了问题,并找到了现象发生的先决条件组合: a) 显示PDF文件的组件当前在应用程序的任何位置打开。 b) telerik组件已解除连接并重新连接

我将包括下面的代码,但我认为这个问题埋在RadDocking或WebBrowser组件的深处

主窗口

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void OpenWindowClick(object sender, RoutedEventArgs e)
    {
        var w = new TestWindow { Owner = this, DataContext = new TestViewModel()};
        w.Show();
    }
}

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:telerikDocking="clr-namespace:Telerik.Windows.Controls;assembly=Telerik.Windows.Controls.Docking" 
    x:Class="TelerikGridDockingVsBrowserVsWindowBug.MainWindow"
    Title="MainWindow" Height="750" Width="925">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="200"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <telerikDocking:RadDocking Grid.Row="0">
        <telerikDocking:RadSplitContainer>
            <telerikDocking:RadPaneGroup>
                <telerikDocking:RadPane Header="I make bugs combined with a webbrowser showing a pdf document">
                    <TextBlock Text="1. Drag me and dock on the same or another location"/>
                </telerikDocking:RadPane>
            </telerikDocking:RadPaneGroup>
        </telerikDocking:RadSplitContainer>
    </telerikDocking:RadDocking>

    <Button Grid.Row="1" Click="OpenWindowClick" Content="2. Open window" Height="50" Margin="0,20"/>

    <WebBrowser Grid.Row="2" Source="http://www.kb.nl/sites/default/files/docs/pdf_guidelines.pdf"/>
</Grid>
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
私有void OpenWindowClick(对象发送器,路由目标)
{
var w=newtestwindow{Owner=this,DataContext=newtestviewmodel()};
w、 Show();
}
}

测试窗口:

public partial class TestWindow : Window
{
    public TestWindow()
    {
        InitializeComponent();
    }
}

<Window x:Class="TelerikGridDockingVsBrowserVsWindowBug.TestWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="TestWindow" Height="150" Width="300">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <TextBlock> 3. Click on the combobox.</TextBlock>
    <ComboBox Grid.Row="1" ItemsSource="{Binding Options}" SelectedItem="{Binding SelectedOption}" Height="50"></ComboBox>
    <TextBlock Grid.Row="2"> This window will then disappear behind its owner</TextBlock>
</Grid>
公共部分类测试窗口:窗口
{
公共测试窗口()
{
初始化组件();
}
}
3.单击组合框。
然后,此窗口将消失在其所有者后面

TestWindow视图模型:

public class TestViewModel
{
    public List<string> Options { get; set; }
    public string SelectedOption { get; set; }

    public TestViewModel()
    {
        Options = new List<string> { "String1", "String2" };
        SelectedOption = Options.First();
    }
}
公共类TestViewModel
{
公共列表选项{get;set;}
公共字符串选择选项{get;set;}
公共TestViewModel()
{
选项=新列表{“String1”、“String2”};
SelectedOption=Options.First();
}
}

关于这件事,我和Telerik有一个公开的问题,如果我发现了什么,我会在这里更新。

我以前遇到过你的情况。。。你有一个无法解释的问题。。。这没有任何意义。。。你已经尝试了你能想到的一切。。。在最后的努力来解决这个问题,你扔给所有有经验的用户在这里。。。然后什么都没有。。。没有回应。。。没有帮助

问题是,如果你不能在你面前的所有代码中找到并修复问题,那么我们如何在没有任何代码的情况下修复它呢

我所能建议的就是你试着找出问题的根源。您可以通过注释掉部分代码,然后运行您的解决方案来查看这是否已经消除了问题,或者问题是否仍然存在。事实上,你的问题很少发生,这将使这个阶段更加棘手


然而,有了毅力,你应该能够缩小问题出现的范围。一旦您成功地排除了足够多的代码,最后一步就是查看是否在一个小得多的新WPF项目中重新创建它。如果你设法达到这个阶段,请回来,并显示您的减少代码。。。然后,我们可能会进一步帮助您。

我认为您的第一步是处理它,直到您能够始终如一地复制错误为止。把重点放在不同的控件组合上,看看会发生什么。一旦发生这种情况,开始设置断点,比较事情的状态,如果需要帮助,在这里发布一些代码。谢谢Jim。请参见上面的编辑:)