Как повернуть элемент управления в wpf из конечной позиции предыдущего поворота - PullRequest
0 голосов
/ 04 октября 2018

Я создал один пользовательский элемент управления с панелью сетки. У меня есть одна кнопка, чтобы повернуть эту сетку по часовой стрелке. Она работает .. Но когда я снова нажимаю кнопку, она вращается с начала, а не для положения концапредыдущего вращения Пожалуйста, помогите мне, как повернуть форму управления, продолжая вместо того, чтобы перезапускать из исходного положения.Мой пользовательский элемент управления Xamal:

<UserControl x:Class="Floorsreen.FloorUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="600" d:DesignWidth="600" Background="Yellow">

    <Grid Width="600" Height="600" Background="Yellow" >    
        <Grid Width="500" Height="500" Background="Wheat" Name="my_grid" RenderTransformOrigin="0.5,0.5" >
            <Grid.RenderTransform>
                <RotateTransform x:Name="transform"  />                 
            </Grid.RenderTransform>
            <Grid HorizontalAlignment="Stretch" >
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*" />
                    <RowDefinition Height="20"  />
                    <RowDefinition Height="*" />
                    <RowDefinition Height="*" />
                    <RowDefinition Height="20"  />
                    <RowDefinition Height="*" />
                    <RowDefinition Height="*" />
                    <RowDefinition Height="20" />
                </Grid.RowDefinitions>
            </Grid>     
        </Grid>
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="516,582,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    </Grid>
</UserControl>

Мой код UserControl позади:

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;
using System.Windows.Media.Animation;


namespace Floorsreen
{
    /// <summary>
    /// Interaction logic for FloorUserControl.xaml
    /// </summary>
    public partial class FloorUserControl : UserControl
    {
        public FloorUserControl()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            Storyboard storyboard = new Storyboard();
            DoubleAnimation rotateAnimation = new DoubleAnimation()
            {
                From = 0,
                To = 90,
                Duration = new Duration(TimeSpan.FromSeconds(10.0))
            };
            Storyboard.SetTarget(rotateAnimation, my_grid);
            Storyboard.SetTargetProperty(rotateAnimation, new PropertyPath("(UIElement.RenderTransform).(RotateTransform.Angle)"));

            storyboard.Children.Add(rotateAnimation);
            storyboard.Begin();
        }
    }
}

И моя главная страница xamal:

<Window x:Class="Floorsreen.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:view="clr-namespace:Floorsreen" 
        Title="MainWindow" Height="800" Width="1000">

    <Window.Resources>
    </Window.Resources>

    <Grid>
        <view:FloorUserControl />
    </Grid>
</Window>

1 Ответ

0 голосов
/ 05 октября 2018
DoubleAnimation rotateAnimation = new DoubleAnimation()
        {
            From = 0,
            To = 90,
            Duration = new Duration(TimeSpan.FromSeconds(10.0))
           ...//

Здесь вы явно указываете нежелательное поведение.Вам необходимо создать анимацию, но затем повторно использовать ту же анимацию, модифицируя ее с помощью логики By, а не создавать новую анимацию с жестко заданными начальными значениями To и From, которые работают только для 25% поворотов на 90 градусов..

Кроме того, при правильном повторном использовании объекта анимации вы можете получить доступ к свойству To, которое будет конечной точкой предыдущего поворота, установить новый From в старое To иновый To к новому From + 90.Если старым To было 360, вы можете сделать From и To 0 и 90 соответственно, как в вашей текущей реализации, для сброса процесса.

Последний вариант - это видеть старый DoubleAnimation объект видимым в обработчике событий, из которого вы читаете его From и To, которые затем сообщают From и Toнового DoubleAnimation, который вы только что сконструировали, таким образом, который ваш код использует в настоящее время.Следующий дескриптор, новый объект анимации рассматривается как старый, и процесс повторяется.

Документация по свойствам

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