1

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 がタブ内に配置されていることも言及する価値があると思います。タブを変更してコンテナーのあるタブに戻すと、ウィンドウが表示されることに気付きました。したがって、それはある種のさわやかな問題でしょうか?

4

1 に答える 1

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>

実際、それはあまり満足のいく修正ではありません。ライブラリに問題があるようです。子の位置が設定されたときにコンテナ サイズを更新する必要があります。

于 2012-10-19T11:42:58.940 に答える