none
позиция Canvas внутри Canvas. Закрепление. RRS feed

  • Вопрос

  • Хотел узнать, можно ли сделать так,чтобы объекты внутри Canvas двигались вместе с ним.

    Пример:

    <Canvas x:Name="Can1"  Height="123" Width="200" Background="#FF639757">
                <Canvas Name="Can2" Height="46" Width="55" Canvas.Left="50" Canvas.Top="33"  Background="#FFDE1A1A"/>
            </Canvas>

    Я изменяю координаты Can1. Он двигается,но Can2 остаётся на месте. 

    Можно как-то сделать привязку координат Can2 к координатам Can1? Или надо руками изменять координаты всех дочерних объектов?

    27 февраля 2014 г. 5:13

Ответы

  • Сорри, про вертикальное выравнивание, это я фигню написал. Конечно же Top. Если у вас внешний Canvas лежит не в другой Canvas, то Canvas.Top у него лишняя.

    Собственно выполнив во вчерашнем примере вот такие изменения в XAML:

    <Window x:Class="WpfApplication2.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">
        <Grid Background="White">
            <Canvas x:Name="Can1" HorizontalAlignment="Left" Height="123" VerticalAlignment="Top" Width="200" Background="#FF639757" >
                <Canvas Name="Can2" Height="46" Canvas.Left="39" Canvas.Top="32" Width="55" Background="#FFDE1A1A"/>
            </Canvas>
            <Button Margin="300,100,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Width="100" Content="Click Me!" Click="Button_Click" />
        </Grid>
    </Window>

    И переписав обработчик клика на вот такой:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Can1.Margin = new Thickness(100, 100, 0, 0);
    }

    Я получил поведение абсолютно идентичное картинке которую я вам показывал вчера.
    28 февраля 2014 г. 5:07
    Отвечающий

Все ответы

  • Добрый день.

    Или вы нас вводите в заблуждение, или одно из двух.

    1. Создаем пустой проект.

    2. Разметка и код главной формы:

    <Window x:Class="WpfApplication2.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">
        <Canvas>
            <Canvas x:Name="Can1"  Height="123" Width="200" Background="#FF639757">
                <Canvas Name="Can2" Height="46" Width="55" Canvas.Left="50" Canvas.Top="33"  Background="#FFDE1A1A"/>
            </Canvas>
            <Button Canvas.Left="300" Canvas.Top="100" Content="Click Me!" Click="Button_Click" />
        </Canvas>
    </Window>


    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Canvas.SetLeft(Can1, 100);
            Canvas.SetTop(Can1, 100);
        }
    }

    3. Запускаем и кликаем:

    Как видите, при изменеии расположения внешнего Canvas, вместе с ним передвигаются и все его "детки".

    27 февраля 2014 г. 5:37
    Отвечающий
  • Хм.

    Ну я сдвиг делаю вот так:

     Can1.Margin = new Thickness( Can1.Margin+3,  Can1.Margin.Top,  Can1.Margin.Right, Can1.Margin.Bottom);

    27 февраля 2014 г. 10:35
  • У внешнего канваса задафте горизонтальное выравнивание влево, вертикальное вправо. И задавайте только Left и Top, остальные два (Right и Bottom) задавайте 0.
    27 февраля 2014 г. 10:46
    Отвечающий
  • Спасибо,завтра попробую.
    27 февраля 2014 г. 10:50
  • Я сейчас понял,что не знаю,как задать вертикальное выравнивание вправо.

    Остальное у меня так и есть.
    28 февраля 2014 г. 2:14
  • У меня вот так:

    <Canvas x:Name="Сan1" HorizontalAlignment="Left" Height="123" VerticalAlignment="Top" Width="200" Background="#FF639757" Canvas.Top="645">
                <Canvas Name="Can2" Height="46" Canvas.Left="39" Canvas.Top="32" Width="55" Background="#FFDE1A1A"/>
            </Canvas>

    28 февраля 2014 г. 2:18
  • Сорри, про вертикальное выравнивание, это я фигню написал. Конечно же Top. Если у вас внешний Canvas лежит не в другой Canvas, то Canvas.Top у него лишняя.

    Собственно выполнив во вчерашнем примере вот такие изменения в XAML:

    <Window x:Class="WpfApplication2.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">
        <Grid Background="White">
            <Canvas x:Name="Can1" HorizontalAlignment="Left" Height="123" VerticalAlignment="Top" Width="200" Background="#FF639757" >
                <Canvas Name="Can2" Height="46" Canvas.Left="39" Canvas.Top="32" Width="55" Background="#FFDE1A1A"/>
            </Canvas>
            <Button Margin="300,100,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Width="100" Content="Click Me!" Click="Button_Click" />
        </Grid>
    </Window>

    И переписав обработчик клика на вот такой:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Can1.Margin = new Thickness(100, 100, 0, 0);
    }

    Я получил поведение абсолютно идентичное картинке которую я вам показывал вчера.
    28 февраля 2014 г. 5:07
    Отвечающий