WPF с набором инструментов Helix, анимация с помощью кода программной части?

Я новичок в WPF и пытаюсь создать 3D-просмотр с набором инструментов Helix. Окно просмотра, сетка и т. д. отображаются, как и ожидалось, и я добавляю простую трубу. Теперь я хочу использовать новую функцию для обновления преобразования трубки на основе ввода пользователя, но я не могу заставить ее работать.

Где я ошибаюсь?

Спасибо.

.xaml

  <UserControl x:Class="WPFUserControl.UserControl1"
             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"
             xmlns:HelixToolkit="clr-namespace:HelixToolkit.Wpf;assembly=HelixToolkit.Wpf" 
             mc:Ignorable="d"
             d:DesignHeight="480" d:DesignWidth="640">
    <Grid>
        <!-- The HelixViewport3D supports camera manipulation, and can be used just like the Viewport3D -->
        <HelixToolkit:HelixViewport3D ZoomExtentsWhenLoaded="True" Name="MainViewPort">

            <HelixToolkit:SunLight/>

            <ModelVisual3D Content="{Binding Model}"/>

            <HelixToolkit:GridLinesVisual3D Width="40" Length="40" MinorDistance="1" MajorDistance="1" Thickness="0.01"/>

        </HelixToolkit:HelixViewport3D>
    </Grid>
</UserControl>

.xaml.cs

using HelixToolkit.Wpf;

namespace WPFUserControl
{
    /// <summary>
    /// Interaction logic for UserControl1.xaml
    /// </summary>
    public partial class UserControl1 : UserControl
    {
        public TubeVisual3D tube1 = new TubeVisual3D();

        public UserControl1()
        {

            InitializeComponent();
            DataContext = this;
            Setup();

        }


        public void SetTranslation(double xx) //this is called from an external app.
        {

             Console.Write(xx); //This prints as expected.

            //TranslateTransform3D Trans = new TranslateTransform3D(new Vector3D(xx, 0, 0));     
          //  tube1.Transform = Trans;  //this does not work.

        }

        public void Setup()
        {             
            int tubeDiameter = 5;
            tube1.Path = new Point3DCollection();
            tube1.Path.Add(new Point3D(-15, 0, 0));
            tube1.Path.Add(new Point3D(15, 0, 0));
            tube1.Diameter = tubeDiameter;
            tube1.Fill = Brushes.Red;
            tube1.IsPathClosed = false;

            MainViewPort.Children.Add(tube1);

        }

    }
}

person anti    schedule 21.07.2016    source источник
comment
Вы должны быть в теме Dispatcher. Попробуйте Dispatcher.Invoke(   -  person egse    schedule 22.07.2016
comment
Спасибо за ваш ответ! Итак, в моей функции SetTranslation я добавляю что-то вроде: Application.Current.Dispatcher.BeginInvoke( DispatcherPriority.Background, new Action(() => { tube1.Transform = Trans; })); Это выглядит правильно?   -  person anti    schedule 22.07.2016
comment
Насколько я помню, в UserControl есть Dispatcher Member. Так что вам не нужен Application.Current. Но это также должно сделать это   -  person egse    schedule 22.07.2016
comment
Ок, отлично. Еще раз спасибо за вашу помощь.   -  person anti    schedule 22.07.2016
comment
Итак, я добавил приведенный выше код в функцию (без Application.Current), и я получаю эту ошибку: «Вызывающий поток не может получить доступ к этому объекту, потому что им владеет другой поток».   -  person anti    schedule 22.07.2016
comment
У меня есть: Dispatcher.BeginInvoke( DispatcherPriority.Background, new Action(() => { tube1.Transform = Trans; })); Я также пробовал: this.Dispatcher.BeginInvoke( DispatcherPriority.Background, new Action(() => { tube1.Transform = Trans; })); Я где-то ошибаюсь? еще раз спасибо.   -  person anti    schedule 22.07.2016
comment
Создайте TranslationTransform внутри фигурных скобок: Dispatcher.BeginInvoke( DispatcherPriority.Background, new Action(() =› { TranslateTransform3D Trans = new TranslateTransform3D(new Vector3D(xx, 0, 0)); tube1.Transform = Trans; })) ;   -  person egse    schedule 25.07.2016
comment
идеально. Еще раз спасибо.   -  person anti    schedule 25.07.2016