Python имеет GOTO
..., и это реализовано внешний модуль чистого Python :)
from goto import goto, label
for i in range(1, 10):
for j in range(1, 20):
for k in range(1, 30):
print i, j, k
if k == 3:
goto .end # breaking out from a deeply nested loop
label .end
print "Finished"
Когда я читаю ваши требования, вместо того, чтобы думать о Grid
, я думаю о DockPanel
.
<DockPanel>
<Grid Name="right"
DockPanel.Dock="Right" MinWidth="100" />
<Grid Name="Left"
DockPanel.Dock="Left" MinWidth="100" />
<Grid Name="middle" />
</DockPanel>
Если вы найдете способ изменить размер вправо
, затем в середине
изменится, когда вправо
изменится размер. Если вы измените размер окна, изменится только средний
. Сохранение и установка ширины
для справа
зависит от вас, но это не должно быть сложно.
Что касается разрешения пользователю изменять размер вправо
, это будет немного сложнее, но я нашел эту статью , которая должна помочь. Эта другая статья может помочь еще больше.
Для видимости правого
, вы можете установить его Видимость
на Свернуто
, чтобы скрыть и восстановите его, установив для него значение Visible
.
Примечание: Панели внутри не обязательно должны быть Grid
s, но вы захотите использовать какую-то Panel
для каждой. Все, что у вас есть в текущих столбцах Grid
, должно работать нормально.
Установите для параметра «Ширина определения столбца» значение «Авто». и поместите элемент управления в этот столбец и поставьте звезду для других столбцов. Каждый раз, когда вы хотите скрыть столбец с содержимым, установите control.Visibility = Collapsed, и, поскольку ширина столбца установлена на Auto, вы не увидите этот столбец, а оставшиеся столбцы займут место.
Я использовал Grid с GridSplitters, так как это упростило изменение размера среднего столбца при сохранении ширины левого и правые столбцы.
XAML:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="MainWindow"
Title="Main Window"
Width="640" Height="480">
<Grid>
<Grid.ColumnDefinitions>
<!-- Left column -->
<ColumnDefinition Width="200" MinWidth="100"/>
<!-- Left GridSplitter column -->
<ColumnDefinition Width="5"/>
<!-- Center column. A width of * means the column will fill
any remaining space. -->
<ColumnDefinition Width="*"/>
<!-- Right GridSplitter column -->
<ColumnDefinition x:Name="RightSplitterColumn" Width="5"/>
<!-- Right column -->
<ColumnDefinition x:Name="RightColumn" Width="200"
MinWidth="100"/>
</Grid.ColumnDefinitions>
<GridSplitter Grid.Column="1" HorizontalAlignment="Stretch" />
<GridSplitter Grid.Column="3" HorizontalAlignment="Stretch" />
<Button x:Name="ToggleButton" Grid.Column="2"
Content="Toggle Right Column" Width="150" Height="25"
Click="ToggleButton_Click" />
</Grid>
</Window>
Code-Behind
При скрытии правого столбца я просто устанавливаю ширину столбца равной 0, поскольку столбцы сетки не имеют свойства видимости.
public partial class MainWindow : Window
{
private double rightColumnWidth;
private double rightColumnMinWidth;
private bool rightColumnHidden;
public MainWindow()
{
this.InitializeComponent();
}
private void ToggleButton_Click(object sender, RoutedEventArgs e)
{
if (rightColumnHidden)
{
// Restore the widths.
RightColumn.MinWidth = rightColumnMinWidth;
RightColumn.Width = new GridLength(rightColumnWidth);
RightSplitterColumn.Width = new GridLength(5);
}
else
{
// Remember the user-set widths for the columns.
rightColumnWidth = RightColumn.Width.Value;
rightColumnMinWidth = RightColumn.MinWidth;
// Remember to set the minimum width to 0 before changing the actual
// width.
RightColumn.MinWidth = 0;
RightColumn.Width = new GridLength(0);
RightSplitterColumn.Width = new GridLength(0);
}
rightColumnHidden = !rightColumnHidden;
}
}
Что касается сохранения и восстанавливая ширину столбцов при запуске, я бы просто сохранил переменные ширины в файле настроек, а затем применил их при повторном открытии вашего приложения.