Ver código fonte

260303001 表现层增加Behaviors包来完成View界面事件绑定到ViewModel的工程。表现层增加语言切换功能,删除Controller层,RelayCommand添加带类型的新类

向羽 孟 1 mês atrás
pai
commit
2c0ea0bb71

+ 4 - 0
MvvmScaffoldFrame48.DLL/CameraTools/HikCamera.cs

@@ -249,6 +249,10 @@ namespace MvvmScaffoldFrame48.DLL.CameraTools
             return result;
         }
 
+        /// <summary>
+        /// 回调型取图方法-关闭采集
+        /// </summary>
+        /// <returns></returns>
         public bool StopReceiveFuntionSetFrameGrabedEvent()
         {
             bool result = false;

+ 1 - 0
MvvmScaffoldFrame48.VIEWMODEL/MvvmScaffoldFrame48.ViewModel.csproj

@@ -50,6 +50,7 @@
     <ErrorReport>prompt</ErrorReport>
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="PresentationFramework" />
     <Reference Include="System" />
     <Reference Include="System.Core" />
     <Reference Include="System.Xml.Linq" />

+ 14 - 1
MvvmScaffoldFrame48.VIEWMODEL/ViewModel/MainViewModel.cs

@@ -7,6 +7,7 @@ using MvvmScaffoldFrame48.Model;
 using MvvmScaffoldFrame48.Model.StorageModel.AuditTrail;
 using System;
 using System.Collections.ObjectModel;
+using System.ComponentModel;
 using System.Windows.Input;
 
 namespace MvvmScaffoldFrame48.ViewModel.ViewModel
@@ -17,12 +18,22 @@ namespace MvvmScaffoldFrame48.ViewModel.ViewModel
         #endregion
 
         #region 界面绑定事件
+        public ICommand Window_ClosingCommand { get; }
         #endregion
 
         #region 属性
+        private ThreadManager MainThreadManager = null;
         #endregion
 
         #region 绑定用Action方法
+        private void Window_Closing(CancelEventArgs e)
+        {
+            if (MainThreadManager != null)
+            {
+                MainThreadManager.StopAll();
+            }
+            Environment.Exit(0);
+        }
         #endregion
 
         #region 绑定用Predicate方法
@@ -37,10 +48,12 @@ namespace MvvmScaffoldFrame48.ViewModel.ViewModel
         #endregion
 
         #region 其他方法
+
         public MainViewModel()
         {
-            ThreadManager MainThreadManager = ThreadManager.Instance;
+            MainThreadManager = ThreadManager.Instance;
             //ThreadManager MainThreadManager = ThreadManager.GetThreadManager
+            Window_ClosingCommand = new RelayCommand<CancelEventArgs>(Window_Closing);
             MainThreadManager.StartCameraGroup(0);
             MainThreadManager.StartCommunication();
         }

+ 33 - 0
MvvmScaffoldFrame48.VIEWMODEL/ViewModel/RelayComand.cs

@@ -33,4 +33,37 @@ namespace MvvmScaffoldFrame48.ViewModel.ViewModel
             _Excute(parameter);
         }
     }
+
+    public class RelayCommand<T> : ICommand
+    {
+        private readonly Action<T> _execute;
+        private readonly Predicate<T> _canExecute;
+
+        // 定义 CanExecuteChanged 事件
+        public event EventHandler CanExecuteChanged;
+
+        public RelayCommand(Action<T> execute, Predicate<T> canExecute = null)
+        {
+            _execute = execute ?? throw new ArgumentNullException(nameof(execute));
+            _canExecute = canExecute;
+        }
+
+        // 判断命令是否可以执行
+        public bool CanExecute(object parameter)
+        {
+            return _canExecute == null || _canExecute((T)parameter);
+        }
+
+        // 执行命令逻辑
+        public void Execute(object parameter)
+        {
+            _execute((T)parameter);
+        }
+
+        // 手动触发 CanExecuteChanged 事件(用于通知 UI 刷新命令状态)
+        public void RaiseCanExecuteChanged()
+        {
+            CanExecuteChanged?.Invoke(this, EventArgs.Empty);
+        }
+    }
 }

+ 1 - 8
MvvmScaffoldFrame48/App.xaml.cs

@@ -1,11 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Configuration;
-using System.Data;
-using System.Linq;
-using System.Threading.Tasks;
-using System.Windows;
-
+using System.Windows;
 namespace MvvmScaffoldFrame48
 {
     /// <summary>

+ 0 - 12
MvvmScaffoldFrame48/Controller/MainController.cs

@@ -1,12 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace MvvmScaffoldFrame48.Controller
-{
-    internal class MainController
-    {
-    }
-}

+ 81 - 0
MvvmScaffoldFrame48/Language/LanguageManager.cs

@@ -0,0 +1,81 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace MvvmScaffoldFrame48.Language
+{
+    public static class LanguageManager
+    {
+        public static event EventHandler LanguageChangeEvent;
+
+        private static int _nowLoadLanguage = 0;
+        public static int NowLoadLanguage
+        {
+            get
+            {
+                return _nowLoadLanguage;
+            }
+        }
+        public static List<string> LanguageList
+        {
+            get
+            {
+                return new List<string>()
+                {
+                    "Chinese",
+                    "English"
+                };
+            }
+        }
+        public static void ChangeLanguage(string languageCode)
+        {
+            // 获取现有的非语言资源字典(如样式)
+            var existingNonLanguageDictionaries = Application.Current.Resources.MergedDictionaries
+                .Where(rd => !IsLanguageResourceDictionary(rd))
+                .ToList();
+
+            // 清除现有字典并重新添加
+            Application.Current.Resources.MergedDictionaries.Clear();
+
+            // 先添加语言资源字典
+            var languageResourceDict = new ResourceDictionary();
+            switch (languageCode)
+            {
+                case "Chinese":
+                    languageResourceDict.Source = new Uri("/Language/String_Chinese.xaml", UriKind.Relative);
+                    _nowLoadLanguage = 0;
+                    break;
+                case "English":
+                    languageResourceDict.Source = new Uri("/Language/String_English.xaml", UriKind.Relative);
+                    _nowLoadLanguage = 1;
+                    break;
+            }
+            Application.Current.Resources.MergedDictionaries.Add(languageResourceDict);
+
+            // 再添加其他非语言资源字典(如样式)
+            foreach (var dict in existingNonLanguageDictionaries)
+            {
+                Application.Current.Resources.MergedDictionaries.Add(dict);
+            }
+            OnLanguageChangeEvent();
+        }
+
+        // 辅助方法:判断是否为语言资源字典
+        private static bool IsLanguageResourceDictionary(ResourceDictionary resourceDict)
+        {
+            if (resourceDict.Source == null) return false;
+
+            var sourcePath = resourceDict.Source.ToString().ToLower();
+            return sourcePath.Contains("/language/string_") ||
+                   sourcePath.Contains("\\language\\string_");
+        }
+
+        private static void OnLanguageChangeEvent()
+        {
+            LanguageChangeEvent?.Invoke(null, EventArgs.Empty);
+        }
+    }
+}

+ 4 - 0
MvvmScaffoldFrame48/Language/String_Chinese.xaml

@@ -0,0 +1,4 @@
+<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+    
+</ResourceDictionary>

+ 4 - 0
MvvmScaffoldFrame48/Language/String_English.xaml

@@ -0,0 +1,4 @@
+<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+    
+</ResourceDictionary>

+ 18 - 1
MvvmScaffoldFrame48/MvvmScaffoldFrame48.csproj

@@ -75,6 +75,7 @@
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
     </ApplicationDefinition>
+    <Compile Include="Language\LanguageManager.cs" />
     <Compile Include="WPFFroms\SuspensionWindow.xaml.cs">
       <DependentUpon>SuspensionWindow.xaml</DependentUpon>
     </Compile>
@@ -87,6 +88,14 @@
     <Compile Include="WPFPage\TestPage.xaml.cs">
       <DependentUpon>TestPage.xaml</DependentUpon>
     </Compile>
+    <Page Include="Language\String_Chinese.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="Language\String_English.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
     <Page Include="WPFFroms\MainWindow.xaml">
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
@@ -95,7 +104,6 @@
       <DependentUpon>App.xaml</DependentUpon>
       <SubType>Code</SubType>
     </Compile>
-    <Compile Include="Controller\MainController.cs" />
     <Compile Include="WPFFroms\MainWindow.xaml.cs">
       <DependentUpon>MainWindow.xaml</DependentUpon>
       <SubType>Code</SubType>
@@ -144,6 +152,10 @@
     <None Include="App.config" />
   </ItemGroup>
   <ItemGroup>
+    <ProjectReference Include="..\MvvmScaffoldFrame48.DLL\MvvmScaffoldFrame48.Dll.csproj">
+      <Project>{75C34EE7-6921-492E-B2D4-0314F2F38AB5}</Project>
+      <Name>MvvmScaffoldFrame48.Dll</Name>
+    </ProjectReference>
     <ProjectReference Include="..\MvvmScaffoldFrame48.MODEL\MvvmScaffoldFrame48.Model.csproj">
       <Project>{56156576-9627-4624-9e1d-26aa7714d1c7}</Project>
       <Name>MvvmScaffoldFrame48.Model</Name>
@@ -156,5 +168,10 @@
   <ItemGroup>
     <Resource Include="FromImage\菜单_白.png" />
   </ItemGroup>
+  <ItemGroup>
+    <PackageReference Include="Microsoft.Xaml.Behaviors.Wpf">
+      <Version>1.1.141</Version>
+    </PackageReference>
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
 </Project>

+ 7 - 1
MvvmScaffoldFrame48/WPFFroms/MainWindow.xaml

@@ -4,8 +4,14 @@
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:local="clr-namespace:MvvmScaffoldFrame48"
+        xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
         mc:Ignorable="d"
-        Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded" Closing="Window_Closing">
+        Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">
+    <i:Interaction.Triggers>
+        <i:EventTrigger EventName="Closing">
+            <i:InvokeCommandAction Command="{Binding Window_ClosingCommand}" PassEventArgsToCommand="True"/>
+        </i:EventTrigger>
+    </i:Interaction.Triggers>
     <Grid>
         <Grid.RowDefinitions>
             <RowDefinition Height="80"/>

+ 0 - 6
MvvmScaffoldFrame48/WPFFroms/MainWindow.xaml.cs

@@ -22,11 +22,5 @@ namespace MvvmScaffoldFrame48
             Uri ShowUri = new Uri("WPFPage\\CustomControlPage.xaml", UriKind.Relative);
             ShowFrame.Navigate(ShowUri);
         }
-
-        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
-        {
-
-            Environment.Exit(0);
-        }
     }
 }