从一个网格到另一个
确定移动的项目,这是我的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新手。 :-)
在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
在专用ColumnDefinition
(RowDefinition
)与Width
(Height
)设置为Auto
和GridSplitter
的路线,以Center
和Stretch
。
也没有必要定义RowDefinition
或ColumnDefinition
如果只有其中之一,并没有必要设置元素的或Column
0 - 它是默认的。
很好的答案。谢谢EvAlex! – dharmatech 2012-04-03 08:41:51
在阅读了关于与列宽度混杂的分隔符的解释之后,我添加了一个按钮,它将列宽打印到控制台。点击这个按钮在不同的点真正说明你的意思。再次感谢EvAlex。 – dharmatech 2012-04-03 09:01:33
不客气:) – EvAlex 2012-04-03 09:03:31