Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法设置窗口位置_C#_.net_Wpf_Xaml_Mdi - Fatal编程技术网

C# 无法设置窗口位置

C# 无法设置窗口位置,c#,.net,wpf,xaml,mdi,C#,.net,Wpf,Xaml,Mdi,我正在使用该库处理WPF应用程序中的MDI 我有一张画布,里面有一个子容器,里面有很多小窗口。我想在x=500,y=500的位置打开窗户。我已经设法用我当前的代码实现了这一点,但奇怪的是,当第一个窗口打开时,它没有显示,即画布仍然是空白的。然后,一旦我添加了另一个窗口,两个窗口都会显示在正确的位置 下面我粘贴了我的XAML和在画布中打开新窗口的代码 <Window x:Name="VisualQueryBuilderWindow" x:Class="QueryBuilder.VisualQ

我正在使用该库处理WPF应用程序中的MDI

我有一张画布,里面有一个子容器,里面有很多小窗口。我想在x=500,y=500的位置打开窗户。我已经设法用我当前的代码实现了这一点,但奇怪的是,当第一个窗口打开时,它没有显示,即画布仍然是空白的。然后,一旦我添加了另一个窗口,两个窗口都会显示在正确的位置

下面我粘贴了我的XAML和在画布中打开新窗口的代码

<Window x:Name="VisualQueryBuilderWindow" x:Class="QueryBuilder.VisualQueryBuilder"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mdi="clr-namespace:WPF.MDI;assembly=WPF.MDI"
    Title="Visual Query Builder" WindowState="Maximized" Closing="VisualQueryBuilderWindow_Closing">
<Window.Resources>
    <Style TargetType="TreeView">
        <Setter Property="Padding" Value="0,0,20,0"/>
        <Setter Property="BorderBrush" Value="Gray"/>
        <Setter Property="BorderThickness" Value="0,0,5,0"/>
    </Style>
</Window.Resources>
<Grid>
    <DockPanel LastChildFill="True">
        <TreeView DockPanel.Dock="Left" 
                  Name="tvSchema" 
                  AllowDrop="True" 
                  TreeViewItem.PreviewMouseLeftButtonDown="TreeViewItem_PreviewMouseLeftButtonDown">
        </TreeView>
        <TabControl>
            <TabItem Name="tabQueryBuilder" Header="Query Builder">
                <Canvas Name="cnvsMain" Background="LightGray" AllowDrop="True" Drop="cnvsMain_Drop">
                    <mdi:MdiContainer Name="mainContainer" Background="LightGray">
                    </mdi:MdiContainer>
                </Canvas>
            </TabItem>
            <TabItem Name="tabResults" Header="Results"></TabItem>
        </TabControl>
    </DockPanel>
</Grid>
请注意,我还尝试在MdiChild实例化的块内设置位置,但在那里也不起作用


更新:我认为还值得一提的是,我的MDI容器放在一个选项卡中,我注意到,如果我更改选项卡并切换回带有容器的选项卡,窗口将显示出来。因此,这可能是某种刷新问题吗?

在实例化TableWindow之前,请尝试此代码

mainContainer.SetBinding(WidthProperty, new Binding("ActualWidth") { Source = cnvsMain });
mainContainer.SetBinding(HeightProperty, new Binding("ActualHeight") { Source = cnvsMain });
您也可以在xaml中执行此操作:

<mdi:MdiContainer Name="mainContainer" Background="LightGray" Width="{Binding ActualWidth, ElementName=cnvsMain}" Height="{Binding ActualHeight, ElementName=cnvsMain}">
                    </mdi:MdiContainer>


实际上,这不是一个很令人满意的解决方案。该库似乎存在问题,它应该在设置子对象的位置时更新容器大小。

在实例化TableWindow之前,请尝试此代码

mainContainer.SetBinding(WidthProperty, new Binding("ActualWidth") { Source = cnvsMain });
mainContainer.SetBinding(HeightProperty, new Binding("ActualHeight") { Source = cnvsMain });
您也可以在xaml中执行此操作:

<mdi:MdiContainer Name="mainContainer" Background="LightGray" Width="{Binding ActualWidth, ElementName=cnvsMain}" Height="{Binding ActualHeight, ElementName=cnvsMain}">
                    </mdi:MdiContainer>


实际上,这不是一个很令人满意的解决方案。库似乎有问题,当设置孩子的位置时,它应该更新容器大小。

刚想好,设置位置后调用
maincainer.InvalidateArrange()
怎么样?@mlorbetske也不走运:(@mlorbetske向question@DotNET你能给我们一个精确控制层次结构的简短片段吗?我已经将我所有的XAML代码添加到问题中了。我刚刚想了一个主意,在设置位置后调用
mainContainer.InvalidateArrange()
怎么样?@mlorbetske也不走运:(@mlorbetske向question@DotNET你能给我们简单介绍一下你的控制层次结构吗?我已经把我所有的XAML代码都添加到这个问题中了