Export (0) Print
Expand All
Expand Minimize
This topic has not yet been rated - Rate this topic

UIElement3D.InvalidateModel Method

Invalidates the model that represents the element.

Namespace:  System.Windows
Assembly:  PresentationCore (in PresentationCore.dll)
'Declaration
Public Sub InvalidateModel

When you derive a class from the UIElement3D class, you can use this method together with the OnUpdateModel method to refresh the model of the element.

You only need to call this method in advanced scenarios. One such advanced scenario is if the derived class has multiple properties that affect the appearance, and you want to update the underlying model only once.

InvalidateModel is introduced in the .NET Framework version 3.5. For more information, see .NET Framework Versions and Dependencies.

The following example shows how to derive from the UIElement3D class to create a Sphere class:


	Public Class Sphere
		Inherits UIElement3D
		' OnUpdateModel is called in response to InvalidateModel and provides
		' a place to set the Visual3DModel property.
		' 
		' Setting Visual3DModel does not provide parenting information, which
		' is needed for data binding, styling, and other features. Similarly, creating render data
		' in 2-D does not provide the connections either.
		' 
		' To get around this, we create a Model dependency property which
		' sets this value.  The Model DP then causes the correct connections to occur
		' and the above features to work correctly.
		' 
		' In this update model we retessellate the sphere based on the current
		' dependency property values, and then set it as the model.  The brush
		' color is blue by default, but the code can easily be updated to let
		' this be set by the user.

		Protected Overrides Sub OnUpdateModel()
			Dim model As New GeometryModel3D()

			model.Geometry = Tessellate(ThetaDiv, PhiDiv, Radius)
			model.Material = New DiffuseMaterial(System.Windows.Media.Brushes.Blue)

			Me.Model = model
		End Sub

		' The Model property for the sphere
		Private Shared ReadOnly ModelProperty As DependencyProperty = DependencyProperty.Register("Model", GetType(Model3D), GetType(Sphere), New PropertyMetadata(AddressOf ModelPropertyChanged))

		Private Shared Sub ModelPropertyChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
			Dim s As Sphere = CType(d, Sphere)
			s.Visual3DModel = s.Model
		End Sub

		Private Property Model() As Model3D
			Get
				Return CType(GetValue(ModelProperty), Model3D)
			End Get

			Set(ByVal value As Model3D)
				SetValue(ModelProperty, value)
			End Set
		End Property

		' The number of divisions to make in the theta direction on the sphere
		Public Shared ReadOnly ThetaDivProperty As DependencyProperty = DependencyProperty.Register("ThetaDiv", GetType(Integer), GetType(Sphere), New PropertyMetadata(15, AddressOf ThetaDivPropertyChanged))

		Private Shared Sub ThetaDivPropertyChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
			Dim s As Sphere = CType(d, Sphere)
			s.InvalidateModel()
		End Sub

		Public Property ThetaDiv() As Integer
			Get
                Return CInt(GetValue(ThetaDivProperty))
			End Get

			Set(ByVal value As Integer)
				SetValue(ThetaDivProperty, value)
			End Set
		End Property

		' The number of divisions to make in the phi direction on the sphere
		Public Shared ReadOnly PhiDivProperty As DependencyProperty = DependencyProperty.Register("PhiDiv", GetType(Integer), GetType(Sphere), New PropertyMetadata(15, AddressOf PhiDivPropertyChanged))

		Private Shared Sub PhiDivPropertyChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
			Dim s As Sphere = CType(d, Sphere)
			s.InvalidateModel()
		End Sub

		Public Property PhiDiv() As Integer
			Get
                Return CInt(GetValue(PhiDivProperty))
			End Get

			Set(ByVal value As Integer)
				SetValue(PhiDivProperty, value)
			End Set
		End Property

		' The radius of the sphere
		Public Shared ReadOnly RadiusProperty As DependencyProperty = DependencyProperty.Register("Radius", GetType(Double), GetType(Sphere), New PropertyMetadata(1.0, AddressOf RadiusPropertyChanged))

		Private Shared Sub RadiusPropertyChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
			Dim s As Sphere = CType(d, Sphere)
			s.InvalidateModel()
		End Sub

		Public Property Radius() As Double
			Get
				Return CDbl(GetValue(RadiusProperty))
			End Get

			Set(ByVal value As Double)
				SetValue(RadiusProperty, value)
			End Set
		End Property

		' Private helper methods
		Private Shared Function GetPosition(ByVal theta As Double, ByVal phi As Double, ByVal radius As Double) As Point3D
			Dim x As Double = radius * Math.Sin(theta) * Math.Sin(phi)
			Dim y As Double = radius * Math.Cos(phi)
			Dim z As Double = radius * Math.Cos(theta) * Math.Sin(phi)

			Return New Point3D(x, y, z)
		End Function

		Private Shared Function GetNormal(ByVal theta As Double, ByVal phi As Double) As Vector3D
			Return CType(GetPosition(theta, phi, 1.0), Vector3D)
		End Function

		Private Shared Function DegToRad(ByVal degrees As Double) As Double
			Return (degrees / 180.0) * Math.PI
		End Function

		Private Shared Function GetTextureCoordinate(ByVal theta As Double, ByVal phi As Double) As System.Windows.Point
			Dim p As New System.Windows.Point(theta / (2 * Math.PI), phi / (Math.PI))

			Return p
		End Function

		' Tesselates the sphere and returns a MeshGeometry3D representing the 
		' tessellation based on the given parameters
		Friend Shared Function Tessellate(ByVal tDiv As Integer, ByVal pDiv As Integer, ByVal radius As Double) As MeshGeometry3D
			Dim dt As Double = DegToRad(360.0) / tDiv
			Dim dp As Double = DegToRad(180.0) / pDiv

			Dim mesh As New MeshGeometry3D()

			For pi As Integer = 0 To pDiv
				Dim phi As Double = pi * dp

				For ti As Integer = 0 To tDiv
					' we want to start the mesh on the x axis
					Dim theta As Double = ti * dt

					mesh.Positions.Add(GetPosition(theta, phi, radius))
					mesh.Normals.Add(GetNormal(theta, phi))
					mesh.TextureCoordinates.Add(GetTextureCoordinate(theta, phi))
				Next ti
			Next pi

			For pi As Integer = 0 To pDiv - 1
				For ti As Integer = 0 To tDiv - 1
					Dim x0 As Integer = ti
					Dim x1 As Integer = (ti + 1)
					Dim y0 As Integer = pi * (tDiv + 1)
					Dim y1 As Integer = (pi + 1) * (tDiv + 1)

					mesh.TriangleIndices.Add(x0 + y0)
					mesh.TriangleIndices.Add(x0 + y1)
					mesh.TriangleIndices.Add(x1 + y0)

					mesh.TriangleIndices.Add(x1 + y0)
					mesh.TriangleIndices.Add(x0 + y1)
					mesh.TriangleIndices.Add(x1 + y1)
				Next ti
			Next pi

			mesh.Freeze()
			Return mesh
		End Function
	End Class


For the complete sample, see UIElement3D Sphere Sample.

.NET Framework

Supported in: 4, 3.5 SP1, 3.0 SP1

.NET Framework Client Profile

Supported in: 4, 3.5 SP1

Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.
Did you find this helpful?
(1500 characters remaining)
Thank you for your feedback

Community Additions

ADD
Show:
© 2014 Microsoft. All rights reserved.