Как добавить 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);
            }
        }

Ответы (0 шт):