ys-hwang 6 éve
szülő
commit
a230a7f2d2
29 módosított fájl, 691 hozzáadás és 47 törlés
  1. 11 4
      Dev/Connection/OHVProtocolServer/OHVProtocolServer/OHVProtocolServer.csproj
  2. BIN
      Dev/OHV/Assambly/OHVConnector.dll
  3. BIN
      Dev/OHV/Assambly/OHVConnector.pdb
  4. 11 2
      Dev/OHV/OHV.Common/Events/MessageEventArgs.cs
  5. 1 1
      Dev/OHV/OHV.Common/Shareds/RegionNames.cs
  6. 5 2
      Dev/OHV/OHV.Module.Interactivity/PopUp/ConveyorControlView.xaml
  7. 43 20
      Dev/OHV/OHV.Module.Interactivity/PopUp/ConveyorControlViewModel.cs
  8. 0 4
      Dev/OHV/OHV.Module.Interactivity/PopUp/LockServoViewModel.cs
  9. 0 1
      Dev/OHV/OHV.Module.MainViews/MainViewModules.cs
  10. 1 1
      Dev/OHV/OHV.Module.MainViews/Views/AutoView.xaml
  11. 17 3
      Dev/OHV/OHV.Module.Status/OHV.Module.Status.csproj
  12. 28 0
      Dev/OHV/OHV.Module.Status/StatusViewModules.cs
  13. 26 0
      Dev/OHV/OHV.Module.Status/VehicleStatusView.xaml
  14. 23 0
      Dev/OHV/OHV.Module.Status/VehicleStatusView.xaml.cs
  15. 36 0
      Dev/OHV/OHV.Module.Status/VehicleStatusViewModel.cs
  16. 1 1
      Dev/OHV/OHV.Vehicle/App.xaml
  17. 1 0
      Dev/OHV/OHV.Vehicle/App.xaml.cs
  18. 4 0
      Dev/OHV/OHV.Vehicle/OHV.Vehicle.csproj
  19. 54 0
      Dev/OHV/ViewTest/CustomControl1.cs
  20. 55 0
      Dev/OHV/ViewTest/Properties/AssemblyInfo.cs
  21. 62 0
      Dev/OHV/ViewTest/Properties/Resources.Designer.cs
  22. 117 0
      Dev/OHV/ViewTest/Properties/Resources.resx
  23. 30 0
      Dev/OHV/ViewTest/Properties/Settings.Designer.cs
  24. 7 0
      Dev/OHV/ViewTest/Properties/Settings.settings
  25. 18 0
      Dev/OHV/ViewTest/Themes/Generic.xaml
  26. 7 6
      Dev/OHV/OHV.Module.Status/UserControl1.xaml
  27. 2 2
      Dev/OHV/OHV.Module.Status/UserControl1.xaml.cs
  28. 122 0
      Dev/OHV/ViewTest/ViewTest.csproj
  29. 9 0
      Dev/OHV/ViewTest/packages.config

+ 11 - 4
Dev/Connection/OHVProtocolServer/OHVProtocolServer/OHVProtocolServer.csproj

@@ -34,6 +34,17 @@
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="GSG.NET, Version=1.0.0.0, Culture=neutral, PublicKeyToken=807456855d2bd861, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\OHV\Assambly\GSG.NET.dll</HintPath>
+    </Reference>
+    <Reference Include="GSG.NET.WPF">
+      <HintPath>..\..\..\OHV\Assambly\GSG.NET.WPF.dll</HintPath>
+    </Reference>
+    <Reference Include="Quartz, Version=1.0.3.2, Culture=neutral, PublicKeyToken=f6b8c98a402cc8a4, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\..\OHV\Assambly\Quartz.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Data" />
     <Reference Include="System.Xml" />
@@ -94,10 +105,6 @@
     <None Include="App.config" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\..\..\..\..\GSG\GSG\GSG.NET\GSG.NET.csproj">
-      <Project>{11e12a58-fdbc-444a-90e6-db96b7e98ff4}</Project>
-      <Name>GSG.NET</Name>
-    </ProjectReference>
     <ProjectReference Include="..\OHVConnector\OHVConnector.csproj">
       <Project>{b9a8b13b-518b-4ae4-b8b6-c2684df6608a}</Project>
       <Name>OHVConnector</Name>

BIN
Dev/OHV/Assambly/OHVConnector.dll


BIN
Dev/OHV/Assambly/OHVConnector.pdb


+ 11 - 2
Dev/OHV/OHV.Common/Events/MessageEventArgs.cs

@@ -74,6 +74,7 @@ namespace OHV.Common.Events
 
         public enum eAxisControlKind
         {
+            NONE = -1,
             OriginReturn,
             Stop,
             EStop,
@@ -85,8 +86,6 @@ namespace OHV.Common.Events
             ReqCurrentPosition,
             ReqStopCurrentPosition,
             FaultReset,
-            Lock,
-            UnLock
         }
 
         public enum eJogMoveDir
@@ -102,6 +101,16 @@ namespace OHV.Common.Events
             LR_SYNC
         }
 
+        /// <summary>
+        /// ConveyorPopupView -> Move 하기 위해 구분용으로 생성함
+        /// </summary>
+        public enum ePosDir
+        {
+            Lock = 0,
+            UnLock
+        }
+
+        public ePosDir PosDir { get; set; }
         public eAxises Axis { get; set; }
         public eEventDir Dir { get; set; }
         public eAxisControlKind Kind { get; set; }

+ 1 - 1
Dev/OHV/OHV.Common/Shareds/RegionNames.cs

@@ -14,6 +14,6 @@ namespace OHV.Common.Shareds
 
         public const string VehicleSubCmdList = "VehicleSubCmdList";
 
-        public const string VehicleStatus = "VehicleStatus";
+        public const string VehicleStatus = "VehicleStatusView";
     }
 }

+ 5 - 2
Dev/OHV/OHV.Module.Interactivity/PopUp/ConveyorControlView.xaml

@@ -45,7 +45,9 @@
                 </Grid.RowDefinitions>
 
                 <Grid Grid.Row="0">
-                    <Button Content="Conveyor Control" Foreground="Orange" Background="{x:Null}" Margin="0,10,455,168"/>
+                    <Button Content="Conveyor Control" Foreground="Orange" Background="{x:Null}" FontSize="20"
+                            VerticalAlignment="Top"
+                            Width="Auto" Height="Auto"/>
                     <StackPanel Orientation="Horizontal"
                                 HorizontalAlignment="Center">
 
@@ -85,7 +87,8 @@
                 </Grid>
 
                 <Grid Grid.Row="1">
-                    <Button Content="Lock UnLock" Foreground="Orange" Background="{x:Null}" Margin="0,10,455,168"/>
+                    <Button Content="Carrier Control" Foreground="Orange" Background="{x:Null}" FontSize="20"
+                            VerticalAlignment="Top" Width="Auto" Height="Auto"/>
                     <StackPanel Orientation="Horizontal"
                                 HorizontalAlignment="Center">
 

+ 43 - 20
Dev/OHV/OHV.Module.Interactivity/PopUp/ConveyorControlViewModel.cs

@@ -35,40 +35,53 @@ namespace OHV.Module.Interactivity.PopUp
         public ICommand PosMoveCommand { get; set; }
 
         IEventAggregator eventAggregator;
-        public ConveyorControlViewModel( IEventAggregator _ea )
+        MessageController messageController;
+        public ConveyorControlViewModel( IEventAggregator _ea , MessageController _msg)
         {
             this.eventAggregator = _ea;
 
+            /*IO Publish Event*/
             this.eventAggregator.GetEvent<IOControlPubSubEvent>().Unsubscribe( UICallbackCommunivation );
             this.eventAggregator.GetEvent<IOControlPubSubEvent>().Subscribe( UICallbackCommunivation , ThreadOption.UIThread );
 
+            /*Lock&UnLock Publish Event*/
             this.eventAggregator.GetEvent<AxisControlPubSubEvent>().Unsubscribe( AxisUICallbackCommunication );
             this.eventAggregator.GetEvent<AxisControlPubSubEvent>().Subscribe( AxisUICallbackCommunication , ThreadOption.UIThread );
 
+            this.messageController = _msg;
+
             this.ConveyorRunCommand = new DelegateCommand<object>( ExecuteCvCommand );
             this.PosMoveCommand = new DelegateCommand<object>( ExecutePosMoveCommand );
         }
 
         private void ExecutePosMoveCommand( object obj )
         {
-            var selectedPos = obj.ToString();
-
-            switch(selectedPos)
+            this.messageController.ShowConfirmationPopupView( "Carrier Move To ?" , r =>
             {
-                case "Lock":
-                    break;
-                case "UnLock":
-                    break;
-            }
-
-            var msg = new AxisControlEventArgs
-            {
-                Dir = AxisControlEventArgs.eEventDir.ToBack ,
-                Kind = AxisControlEventArgs.eAxisControlKind.Move ,
-                Axis = AxisControlEventArgs.eAxises.LR_SYNC ,
-            };
-
-            this.AxisPublishEvent( msg );
+                if ( r.Result == ButtonResult.OK )
+                {
+                    var selectedPos = obj.ToString();
+
+                    var msg = new AxisControlEventArgs
+                    {
+                        Dir = AxisControlEventArgs.eEventDir.ToBack ,
+                        Kind = AxisControlEventArgs.eAxisControlKind.Move ,
+                        Axis = AxisControlEventArgs.eAxises.LR_SYNC ,
+                    };
+
+                    switch ( selectedPos )
+                    {
+                        case "Lock":
+                            msg.PosDir = AxisControlEventArgs.ePosDir.Lock;
+                            break;
+                        case "UnLock":
+                            msg.PosDir = AxisControlEventArgs.ePosDir.UnLock;
+                            break;
+                    }
+
+                    this.AxisPublishEvent( msg );
+                }
+            } );
         }
 
         private void AxisPublishEvent( AxisControlEventArgs msg )
@@ -133,7 +146,12 @@ namespace OHV.Module.Interactivity.PopUp
             this.eventAggregator.GetEvent<IOControlPubSubEvent>().Publish( new IOControlEventArgs { EventDir = IOControlEventArgs.eEventDir.ToBack } );
             this.eventAggregator.GetEvent<IOControlPubSubEvent>().Unsubscribe( UICallbackCommunivation );
 
-            this.eventAggregator.GetEvent<AxisControlPubSubEvent>().Publish( new AxisControlEventArgs { Dir = AxisControlEventArgs.eEventDir.ToBack } );
+            //TODO: - [03-14 ys-hwang] - Closed 해제 처리해줄때 Kind == OriginReturn 값이 들어와버림 그래서 NONE 생성 
+            this.eventAggregator.GetEvent<AxisControlPubSubEvent>().Publish( new AxisControlEventArgs 
+            { 
+                Dir = AxisControlEventArgs.eEventDir.ToBack, 
+                Kind = AxisControlEventArgs.eAxisControlKind.NONE 
+            } );
             this.eventAggregator.GetEvent<AxisControlPubSubEvent>().Unsubscribe( AxisUICallbackCommunication );
         }
 
@@ -143,7 +161,12 @@ namespace OHV.Module.Interactivity.PopUp
             this.eventAggregator.GetEvent<IOControlPubSubEvent>().Publish( new IOControlEventArgs { EventDir = IOControlEventArgs.eEventDir.ToBack } );
 
             /*Lock Axis*/
-            this.eventAggregator.GetEvent<AxisControlPubSubEvent>().Publish( new AxisControlEventArgs { Dir = AxisControlEventArgs.eEventDir.ToBack } );
+            //TODO: - [03-14 ys-hwang] - Opened 할당 시 Kind == OriginReturn 값이 들어와버림 그래서 NONE 생성 
+            this.eventAggregator.GetEvent<AxisControlPubSubEvent>().Publish( new AxisControlEventArgs 
+            { 
+                Dir = AxisControlEventArgs.eEventDir.ToBack,
+                Kind = AxisControlEventArgs.eAxisControlKind.NONE
+            } );
         }
 
         private void CloseDialog( string parameter )

+ 0 - 4
Dev/OHV/OHV.Module.Interactivity/PopUp/LockServoViewModel.cs

@@ -277,8 +277,6 @@ namespace OHV.Module.Interactivity.PopUp
 
         private void ExecuteServoOffCommand( object obj )
         {
-            //TODO: lib direct 사용할지 ? 
-
             var msg = new AxisControlEventArgs
             {
                 Dir = AxisControlEventArgs.eEventDir.ToBack ,
@@ -296,8 +294,6 @@ namespace OHV.Module.Interactivity.PopUp
 
         private void ExecuteServoOnCommand( object obj )
         {
-            //TODO: lib direct 사용할지 ? Event 처리할지 ?
-
             var msg = new AxisControlEventArgs
             {
                 Dir = AxisControlEventArgs.eEventDir.ToBack ,

+ 0 - 1
Dev/OHV/OHV.Module.MainViews/MainViewModules.cs

@@ -14,7 +14,6 @@ namespace OHV.Module.MainViews
 {
     public class MainViewModules : IModule
     {
-
         public void OnInitialized(IContainerProvider containerProvider)
         {
             /* view model assign*/

+ 1 - 1
Dev/OHV/OHV.Module.MainViews/Views/AutoView.xaml

@@ -27,7 +27,7 @@
             <GridSplitter Height="3" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Background="Gray"></GridSplitter>
             <ContentControl Grid.Row="1" prism:RegionManager.RegionName="{x:Static OHVCommonShareds:RegionNames.VehicleSubCmdList}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Width="auto" Height="auto"/>
             <GridSplitter Grid.Row="1" Height="3" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Background="Gray"></GridSplitter>
-            <!--<ContentControl Grid.Row="2" prism:RegionManager.RegionName="{x:Static OHVCommonShareds:RegionNames.VehicleStatus}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Width="auto" Height="auto"/>-->
+            <ContentControl Grid.Row="2" prism:RegionManager.RegionName="{x:Static OHVCommonShareds:RegionNames.VehicleStatus}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Width="auto" Height="auto"/>
         </Grid>
 
     </Grid>

+ 17 - 3
Dev/OHV/OHV.Module.Status/OHV.Module.Status.csproj

@@ -72,12 +72,16 @@
     <Reference Include="PresentationFramework" />
   </ItemGroup>
   <ItemGroup>
-    <Page Include="UserControl1.xaml">
+    <Compile Include="VehicleStatusViewModel.cs">
+      <DependentUpon>VehicleStatusView.xaml</DependentUpon>
+    </Compile>
+    <Page Include="VehicleStatusView.xaml">
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
     </Page>
-    <Compile Include="UserControl1.xaml.cs">
-      <DependentUpon>UserControl1.xaml</DependentUpon>
+    <Compile Include="StatusViewModules.cs" />
+    <Compile Include="VehicleStatusView.xaml.cs">
+      <DependentUpon>VehicleStatusView.xaml</DependentUpon>
       <SubType>Code</SubType>
     </Compile>
   </ItemGroup>
@@ -105,6 +109,16 @@
       <LastGenOutput>Settings.Designer.cs</LastGenOutput>
     </None>
   </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\OHV.Common\OHV.Common.csproj">
+      <Project>{0D1F7FBC-BFB0-4EE4-852D-E2A8D62C5708}</Project>
+      <Name>OHV.Common</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\VehicleControlSystem\VehicleControlSystem.csproj">
+      <Project>{73BAB40E-FC7D-4AB5-85CA-B4CF221DFBD1}</Project>
+      <Name>VehicleControlSystem</Name>
+    </ProjectReference>
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <Import Project="..\packages\MaterialDesignThemes.3.0.1\build\MaterialDesignThemes.targets" Condition="Exists('..\packages\MaterialDesignThemes.3.0.1\build\MaterialDesignThemes.targets')" />
   <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">

+ 28 - 0
Dev/OHV/OHV.Module.Status/StatusViewModules.cs

@@ -0,0 +1,28 @@
+using OHV.Common.Shareds;
+using Prism.Ioc;
+using Prism.Modularity;
+using Prism.Mvvm;
+using Prism.Regions;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OHV.Module.Status
+{
+    public class StatusViewModules : IModule
+    {
+        public void OnInitialized( IContainerProvider containerProvider )
+        {
+            ViewModelLocationProvider.Register<VehicleStatusView , VehicleStatusViewModel>();
+
+            var regionManager = containerProvider.Resolve<IRegionManager>();
+            regionManager.RegisterViewWithRegion( RegionNames.VehicleStatus , typeof( VehicleStatusView ) );
+        }
+
+        public void RegisterTypes( IContainerRegistry containerRegistry )
+        {
+        }
+    }
+}

+ 26 - 0
Dev/OHV/OHV.Module.Status/VehicleStatusView.xaml

@@ -0,0 +1,26 @@
+<UserControl x:Class="OHV.Module.Status.VehicleStatusView"
+             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:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
+             xmlns:local="clr-namespace:OHV.Module.Status"
+             xmlns:prism="http://prismlibrary.com/"
+             prism:ViewModelLocator.AutoWireViewModel="True"
+             mc:Ignorable="d" 
+             d:DesignHeight="400" d:DesignWidth="800"
+             >
+
+    <Grid Background="#263238">
+        <Grid Margin="15">
+            <Border BorderBrush="Gray" BorderThickness="1"/>
+            <StackPanel Orientation="Vertical"
+                        VerticalAlignment="Center"
+                        HorizontalAlignment="Center">
+                <TextBlock Margin="5" Text="Vehicle Current State" Foreground="Silver" FontSize="30"/>
+                <TextBlock Margin="5" HorizontalAlignment="Center" 
+                           Text="{Binding VehicleState, FallbackValue=IDLE}" Foreground="Orange" FontSize="30"/>
+            </StackPanel>
+        </Grid>
+    </Grid>
+</UserControl>

+ 23 - 0
Dev/OHV/OHV.Module.Status/VehicleStatusView.xaml.cs

@@ -0,0 +1,23 @@
+using System.Windows.Controls;
+
+namespace OHV.Module.Status
+{
+    /// <summary>
+    /// UserControl1.xaml에 대한 상호 작용 논리
+    /// </summary>
+    public partial class VehicleStatusView : UserControl
+    {
+        public VehicleStatusViewModel ViewModel { get => this.DataContext as VehicleStatusViewModel; }
+        public VehicleStatusView()
+        {
+            InitializeComponent();
+
+            this.Loaded += VehicleStatusView_Loaded;
+        }
+
+        private void VehicleStatusView_Loaded( object sender , System.Windows.RoutedEventArgs e )
+        {
+            this.ViewModel.Init();
+        }
+    }
+}

+ 36 - 0
Dev/OHV/OHV.Module.Status/VehicleStatusViewModel.cs

@@ -0,0 +1,36 @@
+using Prism.Events;
+using Prism.Mvvm;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using VehicleControlSystem;
+
+namespace OHV.Module.Status
+{
+    public class VehicleStatusViewModel : BindableBase
+    {
+        string _vehicleState;
+        public string VehicleState
+        {
+            get { return this._vehicleState; }
+            set {
+                    this.SetProperty( ref this._vehicleState , value );
+                }
+        }
+        IEventAggregator eventAggregator;
+        VCSystem vcSystem;
+
+        public VehicleStatusViewModel(IEventAggregator _ea, VCSystem _vcSystem )
+        {
+            this.eventAggregator = _ea;
+
+            this.vcSystem = _vcSystem;
+
+            this.VehicleState = vcSystem.autoManager.OperationModeProperty.ToString();
+        }
+
+        public void Init( ) { }
+    }
+}

+ 1 - 1
Dev/OHV/OHV.Vehicle/App.xaml

@@ -2,7 +2,7 @@
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:local="clr-namespace:OHV.Vehicle"
-                          xmlns:prism="http://prismlibrary.com/"
+             xmlns:prism="http://prismlibrary.com/"
              Startup="Application_Startup" Exit="Application_Exit">
     <Application.Resources>
         <ResourceDictionary>

+ 1 - 0
Dev/OHV/OHV.Vehicle/App.xaml.cs

@@ -130,6 +130,7 @@ namespace OHV.Vehicle
             moduleCatalog.AddModule(typeof(OHV.Module.MainViews.MainViewModules));
             moduleCatalog.AddModule(typeof(OHV.Module.Interactivity.MessageController));
             moduleCatalog.AddModule(typeof(OHV.Module.ListViews.ListViewController));
+            moduleCatalog.AddModule( typeof( OHV.Module.Status.StatusViewModules ) );
         }
 
     }

+ 4 - 0
Dev/OHV/OHV.Vehicle/OHV.Vehicle.csproj

@@ -245,6 +245,10 @@
       <Project>{cf748e61-69c2-4dec-a9ec-755b6999077e}</Project>
       <Name>OHV.Module.Monitoring</Name>
     </ProjectReference>
+    <ProjectReference Include="..\OHV.Module.Status\OHV.Module.Status.csproj">
+      <Project>{d00450d6-de54-4584-a377-7aa5d5964d2c}</Project>
+      <Name>OHV.Module.Status</Name>
+    </ProjectReference>
     <ProjectReference Include="..\OHV.SqliteDAL\OHV.SqliteDAL.csproj">
       <Project>{122d81c8-9ab9-4ced-80d2-9c4f2f9deb4c}</Project>
       <Name>OHV.SqliteDAL</Name>

+ 54 - 0
Dev/OHV/ViewTest/CustomControl1.cs

@@ -0,0 +1,54 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace ViewTest
+{
+    /// <summary>
+    /// XAML 파일에서 이 사용자 지정 컨트롤을 사용하려면 1a 또는 1b단계를 수행한 다음 2단계를 수행하십시오.
+    ///
+    /// 1a단계) 현재 프로젝트에 있는 XAML 파일에서 이 사용자 지정 컨트롤 사용.
+    /// 이 XmlNamespace 특성을 사용할 마크업 파일의 루트 요소에 이 특성을 
+    /// 추가합니다.
+    ///
+    ///     xmlns:MyNamespace="clr-namespace:ViewTest"
+    ///
+    ///
+    /// 1b단계) 다른 프로젝트에 있는 XAML 파일에서 이 사용자 지정 컨트롤 사용.
+    /// 이 XmlNamespace 특성을 사용할 마크업 파일의 루트 요소에 이 특성을 
+    /// 추가합니다.
+    ///
+    ///     xmlns:MyNamespace="clr-namespace:ViewTest;assembly=ViewTest"
+    ///
+    /// 또한 XAML 파일이 있는 프로젝트의 프로젝트 참조를 이 프로젝트에 추가하고
+    /// 다시 빌드하여 컴파일 오류를 방지해야 합니다.
+    ///
+    ///     솔루션 탐색기에서 대상 프로젝트를 마우스 오른쪽 단추로 클릭하고
+    ///     [참조 추가]->[프로젝트]를 차례로 클릭한 다음 이 프로젝트를 선택합니다.
+    ///
+    ///
+    /// 2단계)
+    /// 계속 진행하여 XAML 파일에서 컨트롤을 사용합니다.
+    ///
+    ///     <MyNamespace:CustomControl1/>
+    ///
+    /// </summary>
+    public class CustomControl1 : Control
+    {
+        static CustomControl1()
+        {
+            DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
+        }
+    }
+}

+ 55 - 0
Dev/OHV/ViewTest/Properties/AssemblyInfo.cs

@@ -0,0 +1,55 @@
+using System.Reflection;
+using System.Resources;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Windows;
+
+// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해 
+// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면
+// 이러한 특성 값을 변경하세요.
+[assembly: AssemblyTitle("ViewTest")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ViewTest")]
+[assembly: AssemblyCopyright("Copyright ©  2020")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에 
+// 표시되지 않습니다.  COM에서 이 어셈블리의 형식에 액세스하려면 
+// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요.
+[assembly: ComVisible(false)]
+
+//지역화 가능 애플리케이션 빌드를 시작하려면 다음을 설정하세요.
+//.csproj 파일에서 <PropertyGroup> 내에 <UICulture>CultureYouAreCodingWith</UICulture>를
+//설정하십시오. 예를 들어 소스 파일에서 영어(미국)를
+//사용하는 경우 <UICulture>를 en-US로 설정합니다. 그런 다음 아래
+//NeutralResourceLanguage 특성의 주석 처리를 제거합니다. 아래 줄의 "en-US"를 업데이트하여
+//프로젝트 파일의 UICulture 설정과 일치시킵니다.
+
+//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
+
+
+[assembly:ThemeInfo(
+    ResourceDictionaryLocation.None, //테마별 리소스 사전의 위치
+                             //(페이지 또는 응용 프로그램 리소스 사진에
+                             // 리소스가 없는 경우에 사용됨)
+    ResourceDictionaryLocation.SourceAssembly //제네릭 리소스 사전의 위치
+                                      //(페이지 또는 응용 프로그램 리소스 사진에
+                                      // 리소스가 없는 경우에 사용됨)
+)]
+
+
+// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다.
+//
+//      주 버전
+//      부 버전 
+//      빌드 번호
+//      수정 버전
+//
+// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를
+// 기본값으로 할 수 있습니다.
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

+ 62 - 0
Dev/OHV/ViewTest/Properties/Resources.Designer.cs

@@ -0,0 +1,62 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     이 코드는 도구를 사용하여 생성되었습니다.
+//     런타임 버전:4.0.30319.42000
+//
+//     파일 내용을 변경하면 잘못된 동작이 발생할 수 있으며, 코드를 다시 생성하면
+//     이러한 변경 내용이 손실됩니다.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace ViewTest.Properties {
+    
+    
+    /// <summary>
+    ///   지역화된 문자열 등을 찾기 위한 강력한 형식의 리소스 클래스입니다.
+    /// </summary>
+    // 이 클래스는 ResGen 또는 Visual Studio와 같은 도구를 통해 StronglyTypedResourceBuilder
+    // 클래스에서 자동으로 생성되었습니다.
+    // 멤버를 추가하거나 제거하려면 .ResX 파일을 편집한 다음 /str 옵션을 사용하여
+    // ResGen을 다시 실행하거나 VS 프로젝트를 다시 빌드하십시오.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   이 클래스에서 사용하는 캐시된 ResourceManager 인스턴스를 반환합니다.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if ((resourceMan == null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ViewTest.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   이 강력한 형식의 리소스 클래스를 사용하여 모든 리소스 조회에 대해 현재 스레드의 CurrentUICulture 속성을
+        ///   재정의합니다.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+    }
+}

+ 117 - 0
Dev/OHV/ViewTest/Properties/Resources.resx

@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 30 - 0
Dev/OHV/ViewTest/Properties/Settings.Designer.cs

@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace ViewTest.Properties
+{
+    
+    
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+    {
+        
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+        
+        public static Settings Default
+        {
+            get
+            {
+                return defaultInstance;
+            }
+        }
+    }
+}

+ 7 - 0
Dev/OHV/ViewTest/Properties/Settings.settings

@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>

+ 18 - 0
Dev/OHV/ViewTest/Themes/Generic.xaml

@@ -0,0 +1,18 @@
+<ResourceDictionary
+    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+    xmlns:local="clr-namespace:ViewTest">
+    <Style TargetType="{x:Type local:CustomControl1}">
+        <Setter Property="Template">
+            <Setter.Value>
+                <ControlTemplate TargetType="{x:Type local:CustomControl1}">
+                    <Border Background="{TemplateBinding Background}"
+                            BorderBrush="{TemplateBinding BorderBrush}"
+                            BorderThickness="{TemplateBinding BorderThickness}">
+
+                    </Border>
+                </ControlTemplate>
+            </Setter.Value>
+        </Setter>
+    </Style>
+</ResourceDictionary>

+ 7 - 6
Dev/OHV/OHV.Module.Status/UserControl1.xaml

@@ -1,14 +1,15 @@
-<UserControl x:Class="OHV.Module.Status.UserControl1"
+<UserControl x:Class="ViewTest.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:OHV.Module.Status"
-             xmlns:prism="http://prismlibrary.com/"
              xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
-             prism:ViewModelLocator.AutoWireViewModel="True"
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:ViewTest"
              mc:Ignorable="d" 
-             d:DesignHeight="450" d:DesignWidth="800">
+             d:DesignHeight="450" d:DesignWidth="800"
+             
+             xmlns:prism="http://prismlibrary.com/"
+             prism:ViewModelLocator.AutoWireViewModel="True">
     <Grid>
             
     </Grid>

+ 2 - 2
Dev/OHV/OHV.Module.Status/UserControl1.xaml.cs

@@ -13,14 +13,14 @@ using System.Windows.Media.Imaging;
 using System.Windows.Navigation;
 using System.Windows.Shapes;
 
-namespace OHV.Module.Status
+namespace ViewTest
 {
     /// <summary>
     /// UserControl1.xaml에 대한 상호 작용 논리
     /// </summary>
     public partial class UserControl1 : UserControl
     {
-        public UserControl1()
+        public UserControl1( )
         {
             InitializeComponent();
         }

+ 122 - 0
Dev/OHV/ViewTest/ViewTest.csproj

@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{A9F51664-1F9F-4C97-9C1E-0E02D2FD5920}</ProjectGuid>
+    <OutputType>library</OutputType>
+    <RootNamespace>ViewTest</RootNamespace>
+    <AssemblyName>ViewTest</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <WarningLevel>4</WarningLevel>
+    <Deterministic>true</Deterministic>
+    <NuGetPackageImportStamp>
+    </NuGetPackageImportStamp>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="CommonServiceLocator, Version=2.0.4.0, Culture=neutral, PublicKeyToken=489b6accfaf20ef0, processorArchitecture=MSIL">
+      <HintPath>..\packages\CommonServiceLocator.2.0.4\lib\net45\CommonServiceLocator.dll</HintPath>
+    </Reference>
+    <Reference Include="MaterialDesignColors, Version=1.2.2.920, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\MaterialDesignColors.1.2.2\lib\net45\MaterialDesignColors.dll</HintPath>
+    </Reference>
+    <Reference Include="MaterialDesignThemes.Wpf, Version=3.0.1.920, Culture=neutral, processorArchitecture=MSIL">
+      <HintPath>..\packages\MaterialDesignThemes.3.0.1\lib\net45\MaterialDesignThemes.Wpf.dll</HintPath>
+    </Reference>
+    <Reference Include="Prism, Version=7.2.0.1422, Culture=neutral, PublicKeyToken=40ee6c3a2184dc59, processorArchitecture=MSIL">
+      <HintPath>..\packages\Prism.Core.7.2.0.1422\lib\net45\Prism.dll</HintPath>
+    </Reference>
+    <Reference Include="Prism.Wpf, Version=7.2.0.1422, Culture=neutral, PublicKeyToken=40ee6c3a2184dc59, processorArchitecture=MSIL">
+      <HintPath>..\packages\Prism.Wpf.7.2.0.1422\lib\net45\Prism.Wpf.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.ValueTuple.4.5.0\lib\netstandard1.0\System.ValueTuple.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Windows.Interactivity, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\Prism.Wpf.7.2.0.1422\lib\net45\System.Windows.Interactivity.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Xml" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Xaml">
+      <RequiredTargetFramework>4.0</RequiredTargetFramework>
+    </Reference>
+    <Reference Include="WindowsBase" />
+    <Reference Include="PresentationCore" />
+    <Reference Include="PresentationFramework" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="UserControl1.xaml.cs">
+      <DependentUpon>UserControl1.xaml</DependentUpon>
+    </Compile>
+    <Page Include="Themes\Generic.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
+    <Compile Include="CustomControl1.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Page Include="UserControl1.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Properties\AssemblyInfo.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+    <None Include="packages.config" />
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <Import Project="..\packages\MaterialDesignThemes.3.0.1\build\MaterialDesignThemes.targets" Condition="Exists('..\packages\MaterialDesignThemes.3.0.1\build\MaterialDesignThemes.targets')" />
+  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+    <PropertyGroup>
+      <ErrorText>이 프로젝트는 이 컴퓨터에 없는 NuGet 패키지를 참조합니다. 해당 패키지를 다운로드하려면 NuGet 패키지 복원을 사용하십시오. 자세한 내용은 http://go.microsoft.com/fwlink/?LinkID=322105를 참조하십시오. 누락된 파일은 {0}입니다.</ErrorText>
+    </PropertyGroup>
+    <Error Condition="!Exists('..\packages\MaterialDesignThemes.3.0.1\build\MaterialDesignThemes.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MaterialDesignThemes.3.0.1\build\MaterialDesignThemes.targets'))" />
+  </Target>
+</Project>

+ 9 - 0
Dev/OHV/ViewTest/packages.config

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="CommonServiceLocator" version="2.0.4" targetFramework="net45" />
+  <package id="MaterialDesignColors" version="1.2.2" targetFramework="net45" />
+  <package id="MaterialDesignThemes" version="3.0.1" targetFramework="net45" />
+  <package id="Prism.Core" version="7.2.0.1422" targetFramework="net45" />
+  <package id="Prism.Wpf" version="7.2.0.1422" targetFramework="net45" />
+  <package id="System.ValueTuple" version="4.5.0" targetFramework="net45" />
+</packages>