2012-04-03 79 views
0

確定移動的項目,這是我的XAML:從一個網格到另一個

<Window x:Class="nathan___visual_studio_panes___layers.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 

    <DockPanel> 

     <StackPanel DockPanel.Dock="Top"> 

      <Button Name="move_ellipse2_to_GridA" Click="move_ellipse2_to_GridA_Click"> 
       Move ellipse2 to GridA 
      </Button> 

      <Button Name="move_ellipse3_to_GridA" Click="move_ellipse3_to_GridA_Click"> 
       Move ellipse3 to GridA 
      </Button> 

     </StackPanel> 

     <Grid Grid.IsSharedSizeScope="True" Background="AliceBlue"> 

      <Grid Name="gridA">     
       <Grid.RowDefinitions> 
        <RowDefinition/> 
       </Grid.RowDefinitions> 

       <Grid.ColumnDefinitions> 
        <ColumnDefinition/> 
       </Grid.ColumnDefinitions> 

       <Ellipse Grid.Column="0" Grid.Row="0" Fill="CornflowerBlue"/>     
      </Grid> 

      <Grid Name="gridB" Visibility="Visible"> 

       <Grid.ColumnDefinitions> 
        <ColumnDefinition/> 
        <ColumnDefinition/> 
       </Grid.ColumnDefinitions> 

       <Ellipse Grid.Column="1" Name="ellipse2" Fill="Aquamarine"/> 

       <GridSplitter Name="gridB_grid_splitter" Width="5" Grid.Column="1" HorizontalAlignment="Left"/> 

      </Grid> 

      <Grid Name="gridC" Visibility="Visible"> 

       <Grid.ColumnDefinitions> 
        <ColumnDefinition/> 
        <ColumnDefinition/> 
       </Grid.ColumnDefinitions> 

       <Ellipse Grid.Column="1" Name="ellipse3" Fill="Cornsilk"/> 

       <GridSplitter Name="gridC_grid_splitter" Width="5" Grid.Column="1" HorizontalAlignment="Left"/> 
      </Grid> 

     </Grid> 

    </DockPanel> 

</Window> 

而這裏的代碼背後:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace nathan___visual_studio_panes___layers 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     ColumnDefinition GridA_column_for_ellipse2 = new ColumnDefinition(); 
     ColumnDefinition GridA_column_for_ellipse3 = new ColumnDefinition(); 


     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void move_ellipse2_to_GridA_Click(object sender, RoutedEventArgs e) 
     { 
      gridB.Children.Remove(gridB_grid_splitter); 

      var i = gridA.ColumnDefinitions.Count; 

      gridA.ColumnDefinitions.Add(GridA_column_for_ellipse2); 

      gridB.Children.Remove(ellipse2); 
      gridA.Children.Add(ellipse2); 
      Grid.SetColumn(ellipse2, i); 

      var grid_splitter = new GridSplitter() { Width = 5, HorizontalAlignment = HorizontalAlignment.Left }; 
      gridA.Children.Add(grid_splitter); 
      Grid.SetColumn(grid_splitter, i); 

      Console.WriteLine(i); 
     } 

     private void move_ellipse3_to_GridA_Click(object sender, RoutedEventArgs e) 
     { 
      gridC.Children.Remove(gridC_grid_splitter); 

      var i = gridA.ColumnDefinitions.Count; 

      gridA.ColumnDefinitions.Add(GridA_column_for_ellipse3); 

      gridC.Children.Remove(ellipse3); 
      gridA.Children.Add(ellipse3); 
      Grid.SetColumn(ellipse3, i); 

      var grid_splitter = new GridSplitter() { Width = 5, HorizontalAlignment = HorizontalAlignment.Left }; 
      gridA.Children.Add(grid_splitter); 
      Grid.SetColumn(grid_splitter, i); 

      Console.WriteLine(i); 
     }   
    } 
} 

如果我啓動該程序,然後單擊「上移則ellipse2到GridA」和「將ellipse3移動到GridA」按鈕,我會得到「正確的東西」。即三個橢圓和兩個網格分離器都出現在窗口中。然後,如果我啓動程序,拖動網格分隔線(移動橢圓3),單擊「將橢圓2移動到GridA」,拖動橢圓2的網格分隔線(綠色),最後單擊「將橢圓3移動到GridA 「,橢圓3完全消失!

我在這裏做錯了什麼? :-)無論任何分路器拖動,按下兩個按鈕都應導致窗口中出現全部三個省略號。

我知道這是一個奇怪的演示程序。 Adam Nathan的WPF Unleashed中的一個例子是Visual Studio開始屏幕的模型。上面的演示程序只是探索一種不同的技術,用於對接/拆除窗格。

感謝您的任何提示或提示。我是WPF新手。 :-)

回答

2

move_ellipse3_to_GridA_Click方法

foreach (ColumnDefinition column in gridA.ColumnDefinitions) 
    column.Width = new GridLength(1, GridUnitType.Star); 

解釋

問題結束時的溶液

地方下面的代碼是GridSplitter修改ColumnDefinition.Width。它仍然是明星,但它變得像「357 *」。這就是爲什麼gridA中的最後一列變得非常小。如果您在處理程序的開頭放置斷點,則可以看到它,重現您的「不良」情形並再次按該按鈕。檢查gridA.ColumnDefinitions [0]和[1]寬度。

意識

只是爲了讓世界變得更好:建議放置GridSplitter在專用ColumnDefinitionRowDefinition)與WidthHeight)設置爲AutoGridSplitter的路線,以CenterStretch

也沒有必要定義RowDefinitionColumnDefinition如果只有其中之一,並沒有必要設置元素的或Column 0 - 它是默認的。

+0

很好的答案。謝謝EvAlex! – dharmatech 2012-04-03 08:41:51

+0

在閱讀了關於與列寬度混雜的分隔符的解釋之後,我添加了一個按鈕,它將列寬打印到控制檯。點擊這個按鈕在不同的點真正說明你的意思。再次感謝EvAlex。 – dharmatech 2012-04-03 09:01:33

+1

不客氣:) – EvAlex 2012-04-03 09:03:31

相關問題