无法设置窗口位置

时间:2012-10-19 09:52:57

标签: c# .net wpf xaml mdi

我正在使用http://wpfmdi.codeplex.com/库来处理我的WPF应用程序中的MDI。

我有一个包含子容器的Canvas,它包含许多小窗口。我希望窗口在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>

        TableWindow tableWindow = new TableWindow(tableName);

        MdiChild child = new MdiChild()
        {
            MaximizeBox = false,
            MinimizeBox = false,
            Resizable = true,
            ShowIcon = false,
            Title = tableName,
            Content = tableWindow.Content as UIElement //Opens new instance of my window class
        };

        mainContainer.Children.Add(child);
        child.Position = new Point(500, 500);

请注意,我也尝试在MdiChild实例化的块内设置位置,但它也没有在那里工作。

更新:我认为值得一提的是我的MdiContainer放在一个标签中,我注意到如果我更改标签并切换回带有容器的标签,则会显示窗口。那么,这可能是某种令人耳目一新的问题吗?

1 个答案:

答案 0 :(得分:1)

在实例化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>

实际上这不是一个非常令人满意的修复。库似乎存在问题,它应该在设置子位置时更新容器大小。