Перемещение предметов из одной сетки в другую - PullRequest
0 голосов
/ 03 апреля 2012

ОК, вот мой 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);
        }         
    }
}

Если я запускаю программу и нажимаю кнопки «Переместить эллипс2 в GridA» и «Переместить эллипс3 в GridA», я получаю «правильную вещь». То есть в окне появятся три эллипса и два разделителя сетки.

Однако, если я запускаю программу, перетащите разделитель сетки (который перемещает эллипс3), нажмите «Переместить эллипс2 в GridA», перетащите разделитель сетки для эллипса 2 (зеленый) и, наконец, нажмите «Переместить эллипс3 в GridA» , эллипс3 исчезает полностью!

Что я здесь не так делаю? :-) Т.е. нажатие обеих кнопок должно привести к появлению в окне всех трех эллипсов, независимо от перетаскивания разделителя.

Я знаю, что это странная демонстрационная программа. Один из примеров в WPF Unleashed Адама Натана - это модель начального экрана Visual Studio. Демонстрационная программа, описанная выше, просто исследует другую технику для стыковки / расстыковки панелей.

Спасибо за любые советы или подсказки. Я новичок WPF. : -)

1 Ответ

2 голосов
/ 03 апреля 2012

Решение

Поместите следующий код в конец move_ellipse3_to_GridA_Click метода

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

Объяснение

Проблема в том, что GridSplitter изменяет ColumnDefinition.Width. Это остается звездой, но становится чем-то вроде «357 *». Вот почему последний столбец в gridA становится исчезающе маленьким. Вы можете увидеть это, если разместите точку останова в начале обработчика move_ellipse3_to_GridA_Click, воспроизведите свой «плохой» сценарий и нажмите эту кнопку во второй раз. Проверьте gridA.ColumnDefinitions [0] и [1] Ширина там.

Awareness

Просто для того, чтобы сделать мир лучше: рекомендуется поместить GridSplitter в выделенный ColumnDefinition (RowDefinition) с Width (Height), установленным на Auto, и GridSplitter ' s выравнивания по Center и Stretch.

Также нет необходимости определять RowDefinition или ColumnDefinition, если есть только один из них, и нет необходимости устанавливать Row или Column элемента в 0 - это по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...