2012-10-19 2 views
1

Я использую библиотеку http://wpfmdi.codeplex.com/ для обработки MDI в моем приложении WPF.Невозможно установить положение окна

У меня есть холст, который содержит дочерний контейнер, который должен содержать несколько маленьких окон. Я хочу, чтобы окна открывались в позиции 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 и он не работал там.

UPDATE: Я думаю, что это также стоит отметить, что мой MdiContainer помещается внутри вкладки, и я заметил, что если я изменю вкладку и переключиться обратно на один с контейнером, витринами. Таким образом, может ли это быть какой-то освежающей проблемой?

+0

Просто подумал, а как насчет вызова 'mainContainer.InvalidateArrange()' после установки позиции? – mlorbetske

+0

@mlorbetske Не повезло :( –

+0

@mlorbetske Добавлено обновление на вопрос –

ответ

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> 

На самом деле это не очень приятно исправить. Кажется, что проблема связана с библиотекой, она должна обновлять размер контейнера, когда установлена ​​дочерняя позиция.

+0

Большое спасибо, он решил проблему :) –

+0

Добро пожаловать! – Sisyphe

 Смежные вопросы

  • Нет связанных вопросов^_^