Как добавить UserControl из другого решения
Имеется два проекта WPF проекта. В первом основной интерфейс и логика, во втором UserControl с отображением модели. UserControl имеет параметр Points в который я могу передавать массив точек и рисовать модель.
Как добавить в Grid первого проекта UserControl из второго, а так же передавать параметры в него в ViewModel первого проекта?
XAML Первого проекта:
<Window x:Class="VMeter.View.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
xmlns:mdl="clr-namespace:VMeterDraw3D;assembly=VMeterDraw3D"
xmlns:viewModel="clr-namespace:VMeter.ViewModel"
xmlns:viewmodel1="clr-namespace:VMeter.ViewModel" d:DataContext="{d:DesignInstance Type=viewmodel1:MainViewModel}"
mc:Ignorable="d"
Title="MainWindows">
<TabItem Header="Модель" FontSize="14" Width="150" >
<Grid Background="#f5f5f5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5" />
<ColumnDefinition />
<ColumnDefinition Width="5" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="5" />
<RowDefinition />
<RowDefinition Height="5" />
</Grid.RowDefinitions>
<DockPanel Grid.Column="1" Grid.Row="1" Margin="5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<mdl:UserControl1 Points="{Binding ModelPoints}"/> <!-- Здесь UserControl -->
</DockPanel>
</Grid>
</TabItem>
XAML UserControl:
<UserControl x:Class="VMeterDraw3D.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:local="clr-namespace:VMeterDraw3D"
KeyDown="OnKeyDown"
mc:Ignorable="d"
d:DesignHeight="617.0" d:DesignWidth="993.0">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height ="*" />
<RowDefinition Height="Auto" MinHeight="16" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Viewport3D Name="mainViewport"
Grid.Column="1"
Grid.Row="0"
ClipToBounds = "False"
IsHitTestVisible="false"
RenderOptions.EdgeMode="Aliased">
<Viewport3D.Camera>
<OrthographicCamera x:Name="camera" Width="2"
FarPlaneDistance="10"
NearPlaneDistance="1"
LookDirection="0,0,-1"
UpDirection="0,1,0"
Position="0,0,2" />
</Viewport3D.Camera>
<Viewport3D.Children>
<ModelVisual3D x:Name="Light1">
<ModelVisual3D.Content>
<DirectionalLight Color="White" Direction="1, 1, -1" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D x:Name="Light2">
<ModelVisual3D.Content>
<DirectionalLight Color="White" Direction="-1, 1, -1" />
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D x:Name="Light3">
<ModelVisual3D.Content>
<DirectionalLight Color="White" Direction="0,-1,-0.5" />
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D.Children>
</Viewport3D>
<Canvas x:Name="canvasOn3D"
Grid.Row="0"
Background="Transparent"
MouseUp="OnViewportMouseUp"
MouseDown="OnViewportMouseDown"
MouseMove="OnViewportMouseMove" Margin="7,0,0,0" Grid.Column="1"/>
<TextBlock x:Name ="statusPane" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Height="auto" />
<Canvas Name="controlPane"
Grid.Column="0"
Grid.Row="0"
Grid.RowSpan="1"
Background="FloralWhite"
HorizontalAlignment="Left"
Margin="0,10"
Width="0" Grid.ColumnSpan="2"/>
</Grid>
</UserControl>
Код UserControl'a
public partial class UserControl1 : UserControl
{
// transform class object for rotate the 3d model
public VMeterDraw3D.TransformMatrix m_transformMatrix = new VMeterDraw3D.TransformMatrix();
private VMeterDraw3D.Chart3D m_3dChart; // data for 3d chart
public int m_nChartModelIndex = -1; // model index in the Viewport3d
public int m_nSurfaceChartGridNo = 100; // surface chart grid no. in each axis
public int m_nScatterPlotDataNo = 5000; // total data number of the scatter plot
ViewportRect m_selectRect = new ViewportRect();
public int m_nRectModelIndex = -1;
public delegate void MyControlEventHandler(object sender, MyControlEventArgs args);
private int[] zPoints;
public UserControl1()
{
InitializeComponent();
m_selectRect.SetRect(new Point(-0.5, -0.5), new Point(-0.5, -0.5));
VMeterDraw3D.Model3D model3d = new VMeterDraw3D.Model3D();
ArrayList meshs = m_selectRect.GetMeshes();
m_nRectModelIndex = model3d.UpdateModel(meshs, null, m_nRectModelIndex, this.mainViewport);
TransformChart();
}
// function for testing surface chart
public void TestSurfacePlot(int nGridNo)
{
int nXNo = nGridNo;
int nYNo = nGridNo;
// 1. set the surface grid
m_3dChart = new UniformSurfaceChart3D();
((UniformSurfaceChart3D)m_3dChart).SetGrid(200, 250, 0, 200, 0, 300);
// 2. set surface chart z value
double xC = m_3dChart.XCenter();
double yC = m_3dChart.YCenter();
double zV;
int nVertNo = (m_3dChart.GetDataNo() > zPoints.Length) ? zPoints.Length : m_3dChart.GetDataNo();
for (int i = 0; i < nVertNo; i++)
{
Vertex3D vert = m_3dChart[i];
zV = zPoints[i];
m_3dChart[i].z = (float)(zV + 0.0);
}
m_3dChart.GetDataRange();
m_3dChart.SetAxes();
// 3. set the surface chart color according to z vaule
double zMin = m_3dChart.ZMin();
double zMax = m_3dChart.ZMax();
//zMax = 1000;
for (int i = 0; i < nVertNo; i++)
{
Vertex3D vert = m_3dChart[i];
double h = (vert.z - zMin) / (600 - zMin);
Color color = VMeterDraw3D.TextureMapping.PseudoColor(h);
m_3dChart[i].color = color;
}
// 4. Get the Mesh3D array from surface chart
ArrayList meshs = ((UniformSurfaceChart3D)m_3dChart).GetMeshes();
// 5. display vertex no and triangle no of this surface chart
//UpdateModelSizeInfo(meshs);
// 6. Set the model display of surface chart
VMeterDraw3D.Model3D model3d = new VMeterDraw3D.Model3D();
Material backMaterial = new DiffuseMaterial(new SolidColorBrush(Colors.Gray));
m_nChartModelIndex = model3d.UpdateModel(meshs, backMaterial, m_nChartModelIndex, this.mainViewport);
// 7. set projection matrix, so the data is in the display region
float xMin = m_3dChart.XMin();
float xMax = m_3dChart.XMax();
m_transformMatrix.CalculateProjectionMatrix(xMin, xMax, xMin, xMax, zMin, zMax, 0.5);
TransformChart();
}
// this function is used to rotate, drag and zoom the 3d chart
private void TransformChart()
{
if (m_nChartModelIndex == -1) return;
ModelVisual3D visual3d = (ModelVisual3D)(this.mainViewport.Children[m_nChartModelIndex]);
if (visual3d.Content == null) return;
Transform3DGroup group1 = visual3d.Content.Transform as Transform3DGroup;
group1.Children.Clear();
group1.Children.Add(new MatrixTransform3D(m_transformMatrix.m_totalMatrix));
}
public void OnViewportMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs args)
{
Point pt = args.GetPosition(mainViewport);
if (args.ChangedButton == MouseButton.Left) // rotate or drag 3d model
{
m_transformMatrix.OnLBtnDown(pt);
}
else if (args.ChangedButton == MouseButton.Right) // select rect
{
m_selectRect.OnMouseDown(pt, mainViewport, m_nRectModelIndex);
}
}
public void OnViewportMouseMove(object sender, System.Windows.Input.MouseEventArgs args)
{
Point pt = args.GetPosition(mainViewport);
if (args.LeftButton == MouseButtonState.Pressed) // rotate or drag 3d model
{
m_transformMatrix.OnMouseMove(pt, mainViewport);
TransformChart();
}
else if (args.RightButton == MouseButtonState.Pressed) // select rect
{
m_selectRect.OnMouseMove(pt, mainViewport, m_nRectModelIndex);
}
}
public void OnViewportMouseUp(object sender, System.Windows.Input.MouseButtonEventArgs args)
{
Point pt = args.GetPosition(mainViewport);
if (args.ChangedButton == MouseButton.Left)
{
m_transformMatrix.OnLBtnUp();
}
else if (args.ChangedButton == MouseButton.Right)
{
if (m_nChartModelIndex == -1) return;
// 1. get the mesh structure related to the selection rect
MeshGeometry3D meshGeometry = Model3D.GetGeometry(mainViewport, m_nChartModelIndex);
if (meshGeometry == null) return;
// 2. set selection in 3d chart
m_3dChart.Select(m_selectRect, m_transformMatrix, mainViewport);
// 3. update selection display
m_3dChart.HighlightSelection(meshGeometry, Color.FromRgb(200, 200, 200));
}
}
public void OnKeyDown(object sender, System.Windows.Input.KeyEventArgs args)
{
m_transformMatrix.OnKeyDown(args);
TransformChart();
}
public int[] Points
{
set
{
zPoints = value;
int nGridNo = 300;
if (nGridNo < 2) return;
if (nGridNo > 500)
{
MessageBox.Show("too many data");
return;
}
TestSurfacePlot(nGridNo);
}
}