locked
Можно ли посредством C# перевернуть Grid RRS feed

  • Вопрос

  • Суть такая есть Grid с кнопкой в нем ещё Grid с двумя линиями, ну или чем то другим.

    Требуется развернуть на 180 градусов Grid. Ну т.е. поменять местами две линии. Причём надо поменять их так местами, чтобы они не развернулись сами. Т.е. если бы вместо Line был TextBox Text="правильно" то содержание после разворота было бы Text="правильно" а не Text="оньливарп",

    Раньше где то видел информацию, что необходимо сохранить визуальное состояние а потом , как то по нажатию кнопки вернуть другое состояние. Может такой вариант.

    Не вариант ведь менять координаты каждого элемента внутри Grid. :)

    Для примера накидал с поворотом Grid на 15 градусов. Но надо в C#.

        <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
            <Button VerticalAlignment="Top" Click="Button_Click_1" Width="100" Height="100" Content="OK"/>
            <Grid Name="GRD1">
                <Grid.RenderTransform>
                    <TransformGroup>
                        <SkewTransform CenterX="1" CenterY="1" AngleX="165" AngleY="0"/>
                        <RotateTransform Angle="-15"/>
                    </TransformGroup>
                </Grid.RenderTransform>
                <Line Height="100" Width="6" X1="3" X2="3" Y1="0" Y2="100" Stroke="White" StrokeThickness="6" HorizontalAlignment="Left"/>
                <Line Height="100" Width="6" X1="3" X2="3" Y1="0" Y2="100" Stroke="Red" StrokeThickness="6" HorizontalAlignment="Right"/>
            </Grid>
        </Grid>



    Спасибо


    • Изменено developers_s 15 января 2013 г. 3:00
    15 января 2013 г. 3:00

Ответы

  • У элементов управления в WPF есть свойство зависимостей FlowDirection, я думаю это то, что Вам надо. Можете его использовать как в XAML так и в коде (+ через привязку).
    • Изменено Kirill Bessonov 15 января 2013 г. 10:02
    • Предложено в качестве ответа LXGDARK 15 января 2013 г. 10:07
    • Помечено в качестве ответа developers_s 15 января 2013 г. 10:37
    15 января 2013 г. 9:55

Все ответы

  • К сожалению я так и не понял цели, которую вы преследуете.

    Конкретно по приведенному примеру, достаточно поменять местами значения HorizontalAlignment линий. У той что была Left, сделать Right, а у второй наоборот.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    15 января 2013 г. 3:52
  • Дак всё верно. Т.е. левый линии надо вправо а правые влево. Но этих линий очень много и разбивка грида сложная и несимметричная относительно вертикали. Поэтому вручную и менять их буду очень долго.  А так бы перевернуть Grid и разметка бы перевернулась, и все вложенные данные.

    Но я говорю, где то читал, что в зависимости от определенных настроек окно может загружаться с одним расположением набора контролов, а может с другим расположением этого же набора контролов.


    Спасибо

    15 января 2013 г. 7:22
  • Но я говорю, где то читал, что в зависимости от определенных настроек окно может загружаться с одним расположением набора контролов, а может с другим расположением этого же набора контролов.

    Я такого нигде не читал, поэтому не подскажу. Подсказать бы смог имей я больше информации. Пока что по вашему описанию понятно, что вы не совсем удачно подошли к макетированию.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    15 января 2013 г. 7:31
  • Убрал лишнее это то что есть

        <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
            <Button VerticalAlignment="Top" Click="Button_Click_1" Width="100" Height="100" Content="OK"/>
            <Grid Name="GRD1">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="150"/>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="500"/>
                </Grid.ColumnDefinitions>
                <Line Height="100" Width="6" X1="3" X2="3" Y1="0" Y2="100" Stroke="White" StrokeThickness="6" HorizontalAlignment="Right" Grid.Column="0"/>
                <Line Height="6" Width="Auto" X1="0" X2="700" Y1="3" Y2="3" Stroke="Green" StrokeThickness="6" HorizontalAlignment="Right" Grid.Column="1"/>
                <Line Height="100" Width="6" X1="3" X2="3" Y1="0" Y2="100" Stroke="Red" StrokeThickness="6" HorizontalAlignment="Left" Grid.Column="2"/>
            </Grid>
        </Grid>

    по нажатию кнопки должно получиться так:

        <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
            <Button VerticalAlignment="Top" Click="Button_Click_1" Width="100" Height="100" Content="OK"/>
            <Grid Name="GRD1">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="500"/>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="150"/>
                </Grid.ColumnDefinitions>
                <Line Height="100" Width="6" X1="3" X2="3" Y1="0" Y2="100" Stroke="White" StrokeThickness="6" HorizontalAlignment="Left" Grid.Column="2"/>
                <Line Height="6" Width="Auto" X1="0" X2="700" Y1="3" Y2="3" Stroke="Green" StrokeThickness="6" HorizontalAlignment="left" Grid.Column="1"/>
                <Line Height="100" Width="6" X1="3" X2="3" Y1="0" Y2="100" Stroke="Red" StrokeThickness="6" HorizontalAlignment="Right" Grid.Column="0"/>
            </Grid>
        </Grid>

    Но здесь я всё вручную переворачивал. Менял ширину Columndefinition и т привязку линий по горизонтали

    А это всего три элемента. А картинка у меня состоит из xaml Line Path Ellipse и т.п.

    И всё гораздо лучше по получилось если бы просто перевернуть относительно вертикальной оси Grid. Вот если листок бумаги на нём нарисовано слева линии и справа линии. Перевернуть листок бумаги, то те что слева окажутся справа, а те что справа станут слева. Единственное, что они все надписи будут задом наперед но разметка на листе будет правильная (перевернутая). А надо чтобы разметка перевернулась, а надписи отображались правильно.


    Спасибо

    15 января 2013 г. 8:03
  • Ну так как вы себе представляете сделать не получится.

    Решение то есть по любому, но я не могу его смекнуть, так как задачу я так и не понял.

    Да мне понятно что было 500/*/150 а стало 150/*/500, но подозреваю что корень проблемы именно в выборе Grid как контейнера.

    Если принципиально использовать Grid, то придется заморачиваться с привязками и конверторами.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    15 января 2013 г. 9:27
  • Понял. Ладно посмотрю что ещё сделать можно.

    Спасибо

    15 января 2013 г. 9:39
  • У элементов управления в WPF есть свойство зависимостей FlowDirection, я думаю это то, что Вам надо. Можете его использовать как в XAML так и в коде (+ через привязку).
    • Изменено Kirill Bessonov 15 января 2013 г. 10:02
    • Предложено в качестве ответа LXGDARK 15 января 2013 г. 10:07
    • Помечено в качестве ответа developers_s 15 января 2013 г. 10:37
    15 января 2013 г. 9:55
  • У элементов управления в WPF есть свойство зависимостей FlowDirection, я думаю это то, что Вам надо. Можете его использовать как в XAML так и в коде (+ через привязку).

    Кстати да. Никогда не видел ему применения поэтому напрочь забыл. Что бы из первого XAML получить второй достаточно просто задать <Grid Name="GRD1" FlowDirection="RightToLeft ">


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    15 января 2013 г. 10:06