以下是针对 MaxWell 工业上位机项目的三个高级 Region 扩展实现,直接可用于生产环境。
1. Region 过渡动画模板(更丰富的动画效果)
AdvancedTransitionRegionBehavior.cs
// MaxWell.CommonBasis/Regions/Behaviors/AdvancedTransitionRegionBehavior.csusingPrism.Regions;usingSystem.Windows;usingSystem.Windows.Controls;usingSystem.Windows.Media.Animation;namespaceMaxWell.CommonBasis.Regions.Behaviors;publicclassAdvancedTransitionRegionBehavior:RegionBehaviorBase{privateconstdoubleDurationSeconds=0.28;protectedoverridevoidOnAttach(){Region.Views.CollectionChanged+=(s,e)=>{if(e.NewItems!=null){foreach(varnewViewine.NewItems){if(newViewisFrameworkElementelement)ApplyEnterAnimation(element);}}if(e.OldItems!=null){foreach(varoldViewine.OldItems){if(oldViewisFrameworkElementelement)ApplyExitAnimation(element);}}};}privatevoidApplyEnterAnimation(FrameworkElementelement){element.Opacity=0;element.RenderTransform=newTranslateTransform{X=30};varstoryboard=newStoryboard();// 淡入varfade=newDoubleAnimation(0,1,TimeSpan.FromSeconds(DurationSeconds)){EasingFunction=newCubicEase{EasingMode=EasingMode.EaseOut}};Storyboard.SetTarget(fade,element);Storyboard.SetTargetProperty(fade,newPropertyPath("Opacity"));// 右滑进入varslide=newDoubleAnimation(30,0,TimeSpan.FromSeconds(DurationSeconds)){EasingFunction=newCubicEase{EasingMode=EasingMode.EaseOut}};Storyboard.SetTarget(slide,element);Storyboard.SetTargetProperty(slide,newPropertyPath("(UIElement.RenderTransform).(TranslateTransform.X)"));storyboard.Children.Add(fade);storyboard.Children.Add(slide);storyboard.Begin();}privatevoidApplyExitAnimation(FrameworkElementelement){varstoryboard=newStoryboard();varfadeOut=newDoubleAnimation(1,0,TimeSpan.FromSeconds(DurationSeconds*0.7));Storyboard.SetTarget(fadeOut,element);Storyboard.SetTargetProperty(fadeOut,newPropertyPath("Opacity"));storyboard.Children.Add(fadeOut);storyboard.Completed+=(s,e)=>Region.Remove(element);storyboard.Begin();}}2. 带状态保存的 Region 导航(View 状态保持)
StateAwareRegionBehavior.cs
// MaxWell.CommonBasis/Regions/Behaviors/StateAwareRegionBehavior.csusingPrism.Regions;namespaceMaxWell.CommonBasis.Regions.Behaviors;publicclassStateAwareRegionBehavior:RegionBehaviorBase{privatereadonlyDictionary<object,object>_viewStates=new();protectedoverridevoidOnAttach(){Region.Views.CollectionChanged+=(s,e)=>{if(e.OldItems!=null){foreach(varoldViewine.OldItems){SaveViewState(oldView);}}if(e.NewItems!=null){foreach(varnewViewine.NewItems){RestoreViewState(newView);}}};}privatevoidSaveViewState(objectview){if(viewisFrameworkElementelement&&element.DataContextisIRegionStateAwarestateAware){_viewStates[view]=stateAware.SaveState();}}privatevoidRestoreViewState(objectview){if(viewisFrameworkElementelement&&element.DataContextisIRegionStateAwarestateAware){if(_viewStates.TryGetValue(view,outvarsavedState)){stateAware.RestoreState(savedState);}}}}IRegionStateAware 接口
// MaxWell.CommonBasis/Regions/IRegionStateAware.cspublicinterfaceIRegionStateAware{objectSaveState();voidRestoreState(objectstate);}使用示例(在 ViewModel 中实现):
publicclassExperimentViewModel:ViewModelBase,IRegionStateAware{publicdoubleTargetCurrent{get;set;}=5.0;publicboolIsEnabled{get;set;}=true;publicobjectSaveState(){returnnew{TargetCurrent,IsEnabled};}publicvoidRestoreState(objectstate){if(stateisdynamicsaved){TargetCurrent=saved.TargetCurrent;IsEnabled=saved.IsEnabled;}}}3. 完整权限 + 动画 + 联动集成示例
IntegratedRegionBehavior.cs(终极 Behavior)
// MaxWell.CommonBasis/Regions/Behaviors/IntegratedRegionBehavior.csusingPrism.Regions;usingMaxWell.CommonBasis.Services;publicclassIntegratedRegionBehavior:RegionBehaviorBase{privatereadonlyIModulePermissionService_permissionService;privatereadonlyIUserService_userService;privatereadonlyMultiRegionCoordinator_coordinator;publicIntegratedRegionBehavior(IModulePermissionServicepermissionService,IUserServiceuserService,MultiRegionCoordinatorcoordinator){_permissionService=permissionService;_userService=userService;_coordinator=coordinator;}protectedoverridevoidOnAttach(){Region.Views.CollectionChanged+=(s,e)=>{if(e.NewItems==null)return;foreach(varviewine.NewItems){varviewName=GetViewName(view);// 1. 权限检查if(!_permissionService.CanNavigateToView(viewName,_userService.CurrentUser.Role)){Region.Remove(view);MessageBox.Show($"无权限访问{viewName}","权限拒绝",MessageBoxButton.OK,MessageBoxImage.Warning);return;}// 2. 应用动画if(viewisFrameworkElementelement)ApplyAdvancedAnimation(element);}};}privatestringGetViewName(objectview){returnview.GetType().Name.Replace("View","");}privatevoidApplyAdvancedAnimation(FrameworkElementelement){// 可调用之前 AdvancedTransitionRegionBehavior 中的动画逻辑element.Opacity=0;// ... 动画代码}}在 App.xaml.cs 中注册
protectedoverridevoidOnInitialized(){base.OnInitialized();varregionManager=Container.Resolve<IRegionManager>();varintegratedBehavior=newIntegratedRegionBehavior(Container.Resolve<IModulePermissionService>(),Container.Resolve<IUserService>(),Container.Resolve<MultiRegionCoordinator>());regionManager.Regions["MainRegion"].Behaviors.Add("IntegratedRegionBehavior",integratedBehavior);}总结:
- 动画:支持淡入淡出 + 平移
- 状态保持:通过
IRegionStateAware实现 View 状态持久化 - 权限 + 动画 + 联动:通过
IntegratedRegionBehavior统一管理