第一篇:Balder之基础模型Ring指环使用
由于sliverlight4,还没有对3D支持。幸好有第三方的组件Balder能够处理3D的效果。
?
?
1、添加Silverlight用户控件名为:RingDemo.xaml
?
??界面代码如下:
<UserControl x:d:DesignWidth="400" xmlns:Geometries="clr-namespace:Balder.Objects.Geometries;assembly=Balder" xmlns:Lighting="clr-namespace:Balder.Lighting;assembly=Balder" xmlns:Execution="clr-namespace:Balder.Execution;assembly=Balder" xmlns:View="clr-namespace:Balder.View;assembly=Balder" xmlns:my="clr-namespace:Balder.Math;assembly=Balder" xmlns:Debug="clr-namespace:Balder.Debug;assembly=Balder"> <Grid x:Name="LayoutRoot" > <Execution:Game Width="400" Height="300"> <Execution:Game.DebugInfo> <Debug:DebugInfo ShowVertices="False"/> </Execution:Game.DebugInfo> <Execution:Game.Camera> <View:Camera> <View:Camera.Position> <my:Coordinate Y="100" X="0" Z="0"></my:Coordinate> </View:Camera.Position> </View:Camera> </Execution:Game.Camera> <Lighting:OmniLight Position="-100,100,0" /> <Geometries:Ring x:Name="Ring" InnerRadius="10" OuterRadius="30" Size="20"/> </Execution:Game> <!--指环形状控制--> <Grid HorizontalAlignment="Left" VerticalAlignment="Top"> <Grid.ColumnDefinitions> <ColumnDefinition Width="100"/> <ColumnDefinition Width="200" /> <ColumnDefinition Width="30"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="30"/> <RowDefinition Height="30"/> <RowDefinition Height="30"/> <RowDefinition Height="30"/> <RowDefinition Height="30"/> <RowDefinition Height="30"/> <RowDefinition Height="30"/> <RowDefinition Height="30"/> <RowDefinition Height="30"/> <RowDefinition Height="30"/> <RowDefinition Height="30"/> <RowDefinition Height="30"/> </Grid.RowDefinitions> <!--控制指环开始段--> <TextBlock Text="开始段:" Grid.Column="0" Grid.Row="0" VerticalAlignment="Center" /> <Slider x:Name="SliderStart" Grid.Column="1" Grid.Row="0" Minimum="0" Maximum="360" Value="0" ValueChanged="SliderStart_ValueChanged" /> <TextBlock Text="{Binding Value,ElementName=SliderStart}" Grid.Column="2" Grid.Row="0"/> <!--控制指环结束段--> <TextBlock Text="结束段:" Grid.Column="0" Grid.Row="1" VerticalAlignment="Center" /> <Slider x:Name="SliderEnd" Grid.Column="1" Grid.Row="1" Minimum="0" Maximum="360" Value="0" ValueChanged="SliderEnd_ValueChanged" /> <TextBlock Text="{Binding Value,ElementName=SliderEnd}" Grid.Column="2" Grid.Row="1"/> <!--控制指环几个面--> <TextBlock Text="几面:" Grid.Column="0" Grid.Row="2" VerticalAlignment="Center" /> <Slider x:Name="SliderSegments" Grid.Column="1" Grid.Row="2" Minimum="3" Maximum="50" Value="50" ValueChanged="SliderSegments_ValueChanged" /> <TextBlock Text="{Binding Value,ElementName=SliderSegments}" Grid.Column="2" Grid.Row="2"/> <!--控制指环内半径--> <TextBlock Text="内半径:" Grid.Column="0" Grid.Row="3" VerticalAlignment="Center" /> <Slider x:Name="SliderInnerRadius" Grid.Column="1" Grid.Row="3" Minimum="1" Maximum="40" Value="10" ValueChanged="SliderInnerRadius_ValueChanged" /> <TextBlock Text="{Binding Value,ElementName=SliderInnerRadius}" Grid.Column="2" Grid.Row="3"/> <!--控制指环外半径--> <TextBlock Text="外半径:" Grid.Column="0" Grid.Row="4" VerticalAlignment="Center" /> <Slider x:Name="SliderOuterRadius" Grid.Column="1" Grid.Row="4" Minimum="2" Maximum="41" Value="30" ValueChanged="SliderOuterRadius_ValueChanged" /> <TextBlock Text="{Binding Value,ElementName=SliderOuterRadius}" Grid.Column="2" Grid.Row="4"/> <!--控制指环长度--> <TextBlock Text="长度:" Grid.Column="0" Grid.Row="5" VerticalAlignment="Center" /> <Slider x:Name="SliderSize" Grid.Column="1" Grid.Row="5" Minimum="1" Maximum="100" Value="30" ValueChanged="SliderSize_ValueChanged" /> <TextBlock Text="{Binding Value,ElementName=SliderSize}" Grid.Column="2" Grid.Row="5"/> </Grid> </Grid></UserControl>
?
? 后台代码如下:
using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;namespace BalderDemo{ public partial class RingDemo : UserControl { /* * 概述: * 制作一个3D指环,并且展示指环的相关操作。 * * * 注意事项: * 1、指环的园柱的测面不能少于3个面。 * 2、指环的开始断不能大于结束段。 * 3、指环的内半径不能大于等于外半径,内半径的长度不能小于0。 */ public RingDemo() { InitializeComponent(); Loaded += RingDemo_Loaded; } /// <summary> /// 是否加载完成 /// </summary> bool _bLoaded = false; void RingDemo_Loaded(object sender, RoutedEventArgs e) { UpdateProperties(); _bLoaded = true; } //初始化参数 private void UpdateProperties() { Ring.StartAngle = SliderStart.Value; Ring.EndAngle = SliderEnd.Value; Ring.Segments = (int)SliderSegments.Value; Ring.InnerRadius = SliderInnerRadius.Value; Ring.OuterRadius = SliderOuterRadius.Value; } //开始段值改变事件 private void SliderStart_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) { if (!_bLoaded) { return; } //开始段不能大于结束段 if (SliderStart.Value - SliderEnd.Value > 0) { Ring.EndAngle = SliderStart.Value; SliderEnd.Value = SliderStart.Value; } Ring.StartAngle = SliderStart.Value; } //结束段值改变事件 private void SliderEnd_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) { if (!_bLoaded) { return; } //开始段不能大于结束段 if (SliderStart.Value - SliderEnd.Value > 0) { Ring.StartAngle = SliderEnd.Value; SliderStart.Value = SliderEnd.Value; } Ring.EndAngle = SliderEnd.Value; } //外半径改变事件 private void SliderOuterRadius_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) { if (!_bLoaded) { return; } //内半径不能大于外半径 if (SliderInnerRadius.Value - SliderOuterRadius.Value > 0) { Ring.InnerRadius = SliderOuterRadius.Value - 0.1; SliderInnerRadius.Value = SliderOuterRadius.Value - 0.1; } Ring.OuterRadius = SliderOuterRadius.Value; } //内半径改变事件 private void SliderInnerRadius_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) { if (!_bLoaded) { return; } //内半径不能大于外半径 if (SliderInnerRadius.Value - SliderOuterRadius.Value > 0) { Ring.OuterRadius = SliderInnerRadius.Value + 0.1; SliderOuterRadius.Value = SliderInnerRadius.Value + 0.1; } Ring.InnerRadius = SliderInnerRadius.Value; } //指环面改变事件 private void SliderSegments_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) { if (!_bLoaded) { return; } Ring.Segments = (int)SliderSegments.Value; } /// <summary> /// 指环的透明度 /// </summary> private void SliderOpacity_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) { } /// <summary> /// 指环的透明度 /// </summary> private void SliderSize_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) { if (!_bLoaded) { return; } Ring.Size = (int)SliderSize.Value; } }}
?