我慢慢地习惯了WPF和Helix Toolkit。我真的非常喜欢Helix。尽管我学习缓慢(几年前从学术界退休),但我取得了很大进步。我已经重新创建了几个Helix示例,以逐步学习主要功能。我想我已经学到了我需要的所有知识,除了如何制作动画。 对于动画,我的意思是。我将基于一些数值计算来绘制变形管道的纹理。我想逐步绘制变形的形状,因为管道基于每个时间步的结果弯曲。 我首先使用WPF滑块控件模拟此过程。我正在尝试在滑块的每个(整数)步骤移动对象。我现在正在尝试通过移动环面对象(来自环面示例)来实现这一点。我在MainWindow中添加了一个新的“ Translation”属性。我将此属性连接到滑块。绑定在我通过消息框和TextBlock显示器(我要发布的代码)对其进行测试时起作用。我可以看到文本块内容发生了变化,当我启用MessageBox时,我看到“ RaiseTranslationChanged”方法已激活,因此“ trans”变量已更新。应该使用整数“ trans”变量来转换每一侧的两个圆环对象。不幸的是,圆环物体不会移动。 我怀疑这可能与“ viewmodel”或“ dependencyproperty”或两者有关,因为我可以看到管直径与滑块很好地结合在一起。我对Windows消息传递系统和WPF“数据上下文”有基本的了解,但我似乎并不了解它们如何相互作用。如果有人可以发布该问题的解决方案,以及如何用相对简单的解释使循环中的环面对象动画化,我将不胜感激。 任何帮助将不胜感激。最后,我还将分享我的作品,并与提供意见的任何人分享任何学分。我同时发布了修改后的cs和xalm文件。
i.konuk
mainwindow.xaml:
<Window x:Class="TorusDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ht="clr-namespace:HelixToolkit.Wpf;assembly=HelixToolkit.Wpf"
Title="TubeDemo" Height="800" Width="800">
<Grid ShowGridLines="True" >
<Grid.RowDefinitions>
<RowDefinition Height="4*" />
<RowDefinition Height="1" />
<RowDefinition Height="1*" />
</Grid.RowDefinitions>
<ht:HelixViewport3D x:Name="viewPort" ZoomExtentsWhenLoaded="True">
<ht:SunLight/>
<ht:TorusVisual3D x:Name="torus1" TorusDiameter="{Binding Value, ElementName=torusDiameterSlider}" TubeDiameter="{Binding Value, ElementName=tubeDiameterSlider}"
ThetaDiv="{Binding Value, ElementName=thetaDivSlider}" PhiDiv="{Binding Value, ElementName=phiDivSlider}" Fill="Red" />
<ht:TorusVisual3D x:Name="torus2" TorusDiameter="{Binding Value, ElementName=torusDiameterSlider}" TubeDiameter="{Binding Value, ElementName=tubeDiameterSlider}"
ThetaDiv="{Binding Value, ElementName=thetaDivSlider}" PhiDiv="{Binding Value, ElementName=phiDivSlider}" Fill="Green"/>
<ht:TorusVisual3D x:Name="torus3" TorusDiameter="{Binding Value, ElementName=torusDiameterSlider}" TubeDiameter="{Binding Value, ElementName=tubeDiameterSlider}"
ThetaDiv="{Binding Value, ElementName=thetaDivSlider}" PhiDiv="{Binding Value, ElementName=phiDivSlider}" Fill="Blue" />
</ht:HelixViewport3D>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Bottom" Opacity="0.9" >
<Slider x:Name="torusDiameterSlider" Value="3" Minimum="0.1" Maximum="10" Width="150" Margin="10"/>
<Slider x:Name="tubeDiameterSlider" Value="1" Minimum="0.1" Maximum="5" Width="150" Margin="10"/>
<Slider x:Name="thetaDivSlider" Value="36" Minimum="3" Maximum="256" Width="150" Margin="10"/>
<Slider x:Name="phiDivSlider" Value="24" Minimum="3" Maximum="256" Width="150" Margin="10"/>
</StackPanel>
<StackPanel Grid.Row="3" Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Bottom" Opacity="0.9" >
<Slider x:Name="TranslationSlider" Minimum="1" Maximum="8" Width="150" Margin="10"
Value="{Binding Path=Translation, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Text="{Binding UpdateSourceTrigger=PropertyChanged, Path=Translation, Mode=TwoWay}" />
</StackPanel>
</Grid>
</Window>
mainwindow.xaml.cs文件:
// --------------------------------------------------------------------------------------------------------------------
// <copyright file="MainWindow.xaml.cs" company="Helix Toolkit">
// Copyright (c) 2016 Helix Toolkit contributors
// </copyright>
// <summary>
// Interaction logic for MainWindow.xaml
// </summary>
// --------------------------------------------------------------------------------------------------------------------
namespace TorusDemo
{
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Media.Media3D;
using HelixToolkit.Wpf;
// using ExampleBrowser;
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
// [Example(null, "Shows three torus objects using the TorusVisual3D.")]
public partial class MainWindow : Window
{
public static int trans = 4;
// Static event to create change notification
public static event EventHandler TranslationChanged;
// Event invocator
private static void RaiseTranslationChanged()
{
EventHandler handler = TranslationChanged;
if (handler != null)
{
handler(null, EventArgs.Empty);
}
// MessageBox.Show("TranslationChanged", "MainWindow");
}
// Static property to bind to
public static int Translation
{
get { return trans; }
set
{
trans = value;
RaiseTranslationChanged();
}
}
public MainWindow()
{
InitializeComponent();
DataContext = this;
this.DataContext = this;
torus1.Transform = settransformvectors(-trans);
torus3.Transform = settransformvectors(trans);
viewPort.Camera.Position = new Point3D(0, 0, 10);
}
public Transform3D settransformvectors(int trans)
{
Transform3D Transform = new TranslateTransform3D(new Vector3D(trans, 0, 0));
return Transform;
}
}
}