2012-04-03 176 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

相关问题