添加右侧菜单

master
mzhifa 1 year ago
parent 693d89522c
commit 8cc06bb9bd

Binary file not shown.

After

Width:  |  Height:  |  Size: 779 B

@ -6,7 +6,7 @@ using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using System.IO;
using StartServerWPF.Modules.Main.Model;
using StartServerWPF.Modules.Main.Models;
namespace StartServerWPF.Modules.Main
{

@ -12,6 +12,7 @@ namespace StartServerWPF.Modules.Main
{
var iRegion= containerProvider.Resolve<IRegionManager>();
iRegion.RegisterViewWithRegion("MainContentRegion", typeof(MainView));
iRegion.RegisterViewWithRegion("LeftMenuTreeRegion", typeof(TreeMenuView));
}
public void RegisterTypes(IContainerRegistry containerRegistry)

@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StartServerWPF.Modules.Main.Model
namespace StartServerWPF.Modules.Main.Models
{
public class ApmsConfig
{

@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Text;
namespace StartServerWPF.Modules.Main.Model
namespace StartServerWPF.Modules.Main.Models
{
class CSMessage
{

@ -0,0 +1,69 @@
using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
namespace StartServerWPF.Modules.Main.Models
{
public class MenuItemModel : BindableBase
{
public string MenuIcon { get; set; }
public string MenuHeader { get; set; }
public string TargetView { get; set; }
private bool _isExpanded;
public bool IsExpanded
{
get { return _isExpanded; }
set { SetProperty(ref _isExpanded, value); }
}
private ObservableCollection<MenuItemModel> _children;
public ObservableCollection<MenuItemModel> Children
{
get { return _children; }
set { SetProperty(ref _children, value); }
}
private ICommand _openViewCommand;
public ICommand OpenViewCommand
{
get
{
if (_openViewCommand == null)
_openViewCommand = new DelegateCommand<MenuItemModel>((model) =>
{
if ((model.Children == null || model.Children.Count == 0) &&
!string.IsNullOrEmpty(model.TargetView))
_regionManager.RequestNavigate("MainContentRegion", model.TargetView);
else
IsExpanded = !IsExpanded;
});
return _openViewCommand;
}
}
IRegionManager _regionManager = null;
public MenuItemModel(IRegionManager regionManager)
{
_regionManager = regionManager;
}
private bool _isSelected;
public bool IsSelected
{
get => _isSelected;
set
{
SetProperty<bool>(ref _isSelected, value);
}
}
}
}

@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StartServerWPF.Modules.Main.Model
namespace StartServerWPF.Modules.Main.Models
{
public class SystemConfig
{

@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace StartServerWPF.Modules.Main.Model
namespace StartServerWPF.Modules.Main.Models
{
public class CSUserSigin
{

@ -5,7 +5,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StartServerWPF.Modules.Main.Model
namespace StartServerWPF.Modules.Main.Models
{
/// <summary>
/// VPN信息类

@ -5,7 +5,9 @@
<UseWindowsForms>True</UseWindowsForms>
</PropertyGroup>
<ItemGroup>
<None Remove="Fonts\iconfont.ttf" />
<None Remove="Images\calendar.png" />
<None Remove="Images\Union.png" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="HandyControl" Version="3.4.0" />
@ -21,6 +23,8 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Resource Include="Fonts\iconfont.ttf" />
<Resource Include="Images\calendar.png" />
<Resource Include="Images\Union.png" />
</ItemGroup>
</Project>

@ -0,0 +1,4 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<FontFamily x:Key="Iconfont">pack://application:,,,/StartServerWPF.Modules.Main;component/Fonts/#iconfont</FontFamily>
</ResourceDictionary>

@ -14,7 +14,7 @@ using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows;
using System.Collections.ObjectModel;
using StartServerWPF.Modules.Main.Model;
using StartServerWPF.Modules.Main.Models;
using System.Windows.Media;
using System.Timers;
using System.Windows.Threading;
@ -296,7 +296,6 @@ namespace StartServerWPF.Modules.Main.ViewModels
param.Add("type", 1);// 编辑
param.Add("model", sc);
param.Add("moniTime", MoniStartTime);
_dialogService.ShowDialog(
"SetParamDialog",
param,

@ -1,7 +1,7 @@
using Prism.Commands;
using Prism.Mvvm;
using Prism.Services.Dialogs;
using StartServerWPF.Modules.Main.Model;
using StartServerWPF.Modules.Main.Models;
using System;
using System.Collections.Generic;
using System.Linq;

@ -0,0 +1,94 @@
using Prism.Commands;
using Prism.Events;
using Prism.Ioc;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using StartServerWPF.Modules.Main.Models;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace StartServerWPF.Modules.Main.ViewModels
{
public class TreeMenuViewModel : BindableBase
{
private ObservableCollection<MenuItemModel> _menus;
public ObservableCollection<MenuItemModel> Menus { get => _menus; set => SetProperty(ref _menus, value); }
// private List<MenuInfoDTO> origMenus = null;
private IRegionManager _regionManager = null;
private readonly IDialogService _dialogService;
public TreeMenuViewModel(IContainerProvider containerProvider, IRegionManager regionManager, IEventAggregator ea, IDialogService dialogService)
{
_regionManager = regionManager;
this._dialogService = dialogService;
//var global = containerProvider.Resolve<GlobalEntity>();// 注册一个单例
// ea.GetEvent<LoginEvent>().Subscribe(OnLogin, ThreadOption.UIThread);
}
#region 事件
public DelegateCommand AboutCommand => new(()=>
{
DialogParameters param=new DialogParameters();
_dialogService.ShowDialog(
"AboutDialogView",
param,
new Action<IDialogResult>(result =>
{
if (result != null && result.Result == ButtonResult.OK)
{
MessageBox.Show("数据已保存", "提示");
}
}));
});
#endregion
//private void OnLogin(LoginPayload loginPayload)
//{
// Menus = new ObservableCollection<MenuItemModel>();
// if (!loginPayload.IsLogingIn) //
// {
// //登录完成更新措菜单
// if (GlobalEntity.CurrentUserInfo != null)
// {
// origMenus = GlobalEntity.CurrentUserInfo.Menus;
// this.FillMenus(Menus, 0);
// }
// }
//}
///递归
///
private void FillMenus(ObservableCollection<MenuItemModel> menus, int parentId)
{
// var sub = origMenus.Where(m => m.ParentId == parentId).OrderBy(o => o.Index);
//if (sub.Count() > 0)
//{
// foreach (var item in sub)
// {
// MenuItemModel mm = new MenuItemModel(_regionManager)
// {
// MenuHeader = item.MenuHeader,
// MenuIcon = item.MenuIcon,
// TargetView = item.TargetView
// };
// menus.Add(mm);
// FillMenus(mm.Children = new ObservableCollection<MenuItemModel>(), item.MenuId);
// }
//}
}
}
}

@ -0,0 +1,140 @@
<UserControl x:Class="StartServerWPF.Modules.Main.Views.TreeMenuView"
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:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/StartServerWPF.Modules.Main;component/Styles/BaseResources.xaml"/>
<!--<ResourceDictionary Source="/Detection.platform.Assets;component/Styles/ButtonStyles.xaml"/>-->
<ResourceDictionary>
<ControlTemplate TargetType="ToggleButton" x:Key="ArrowButtonTemplate">
<Grid Background="Transparent" Name="back">
<TextBlock Text="&#xe81d;" FontFamily="{StaticResource Iconfont}"
VerticalAlignment="Center" HorizontalAlignment="Center"
RenderTransformOrigin="0.5,0.5" Name="arrow">
</TextBlock>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="arrow" Property="RenderTransform">
<Setter.Value>
<RotateTransform Angle="90"/>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="back" Property="Background" Value="#11000000"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid Background="#66FFFFFF">
<Grid.Resources>
<Style TargetType="TreeViewItem">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"></Setter>
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
<Setter Property="KeyboardNavigation.AcceptsReturn" Value="True" />
<Setter Property="HorizontalContentAlignment" Value="Left"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="8,5"/>
<Setter Property="Foreground" Value="#FF565656"/>
<Setter Property="FontFamily" Value="{StaticResource Iconfont}"/>
<Setter Property="FontSize" Value="12"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TreeViewItem">
<Grid Background="Transparent" Name="root">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition MaxWidth="30"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" MinHeight="36"/>
<RowDefinition />
</Grid.RowDefinitions>
<Grid.InputBindings>
<MouseBinding MouseAction="LeftDoubleClick"
Command="{Binding OpenViewCommand}"
CommandParameter="{Binding}"/>
</Grid.InputBindings>
<Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}"
CornerRadius="0" Grid.ColumnSpan="2" Padding="{TemplateBinding Padding}"
SnapsToDevicePixels="true">
<ContentPresenter x:Name="PART_Header" ContentSource="Header"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}">
</ContentPresenter>
</Border>
<ToggleButton x:Name="Expander" Grid.Column="1" ClickMode="Press"
IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}"
Template="{StaticResource ArrowButtonTemplate}"/>
<ItemsPresenter x:Name="ItemsHost" Margin="18,0,0,0" Grid.ColumnSpan="2" Grid.Row="1" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsExpanded" Value="false">
<Setter Property="Visibility" TargetName="ItemsHost" Value="Collapsed"/>
</Trigger>
<Trigger Property="HasItems" Value="false">
<Setter Property="Visibility" TargetName="Expander" Value="Hidden"/>
</Trigger>
<Trigger Property="IsSelected" Value="true">
<Setter Property="Background" TargetName="Bd" Value="#FF009DFF"/>
<Setter Property="Foreground" Value="#FFFFFFFF"/>
<Setter Property="Foreground" Value="#FFFFFFFF" TargetName="Expander"/>
</Trigger>
<!--被选中后失去焦点-->
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="true"/>
<Condition Property="IsSelectionActive" Value="false"/>
</MultiTrigger.Conditions>
<Setter Property="Background" TargetName="Bd" Value="SkyBlue"/>
<Setter Property="Foreground" Value="#FFFFFFFF"/>
</MultiTrigger>
<DataTrigger Binding="{Binding MenuIcon}" Value="{x:Null}">
<Setter Property="Margin" Value="10,0,0,0" TargetName="root"/>
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Grid.Resources>
<TreeView BorderThickness="0" Background="Transparent" ItemsSource="{Binding Menus}" Margin="0,10">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children,Mode=TwoWay}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="30" Name="c1"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding MenuIcon}" VerticalAlignment="Center" HorizontalAlignment="Center"
FontSize="15" SnapsToDevicePixels="True"
FontFamily="{StaticResource Iconfont}"/>
<TextBlock Text="{Binding MenuHeader}" Grid.Column="1" Margin="5,5,0,5" FontSize="15"/>
</Grid>
<HierarchicalDataTemplate.Triggers>
<DataTrigger Binding="{Binding MenuIcon}" Value="{x:Null}">
<Setter TargetName="c1" Property="Width" Value="0"/>
</DataTrigger>
</HierarchicalDataTemplate.Triggers>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</Grid>
</UserControl>

@ -0,0 +1,28 @@
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 StartServerWPF.Modules.Main.Views
{
/// <summary>
/// TreeMenuView.xaml 的交互逻辑
/// </summary>
public partial class TreeMenuView : UserControl
{
public TreeMenuView()
{
InitializeComponent();
}
}
}

@ -1,4 +1,4 @@
using StartServerWPF.Modules.Main.Model;
using StartServerWPF.Modules.Main.Models;
using SuperSocket.ClientEngine;
using System;
using System.Collections.Generic;

@ -2,7 +2,8 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:StartServerWPF"
xmlns:prism="http://prismlibrary.com/" >
xmlns:prism="http://prismlibrary.com/"
DispatcherUnhandledException="App_DispatcherUnhandledException" >
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>

@ -1,8 +1,15 @@
using Prism.Ioc;
using Microsoft.VisualBasic.Logging;
using Prism.Ioc;
using Prism.Modularity;
using StartServerWPF.Modules.Main;
using StartServerWPF.Views;
using System.Collections;
using System.Net.NetworkInformation;
using System.Text;
using System;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Threading;
namespace StartServerWPF
{
@ -11,6 +18,12 @@ namespace StartServerWPF
/// </summary>
public partial class App
{
public App()
{
System.AppDomain.CurrentDomain.UnhandledException += new System.UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
}
protected override Window CreateShell()
{
return Container.Resolve<MainWindow>();
@ -26,5 +39,102 @@ namespace StartServerWPF
moduleCatalog.AddModule<MainModule>();
base.ConfigureModuleCatalog(moduleCatalog);
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
try
{
System.Exception error = (System.Exception)e.ExceptionObject;
StringBuilder stringBuilder = ExtractAllStackTrace(error);
}
catch(Exception ex)
{
}
}
/// <summary>
/// UI线程未捕获异常处理事件UI主线程
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder = ExtractAllStackTrace(e.Exception);
//if (e.Exception.InnerException != null)
//{
// stringBuilder.AppendFormat("\n\r {0}", e.Exception.InnerException);
// stringBuilder.AppendFormat("\n\r {0}", e.Exception.InnerException.StackTrace);
//}
//stringBuilder.AppendFormat("\n\r {0}", e.Exception.StackTrace);
//string errmsg;
//if (e.Exception is XamlParseException && e.Exception.InnerException != null)
//{
// errmsg = e.Exception.InnerException.Message;
//}
//else
//{
// errmsg = e.Exception.Message;
//}
e.Handled = true;
}
//Task线程内未捕获异常处理事件
private static void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder = ExtractAllStackTrace(e.Exception);
//Exception ex = e.Exception;
//string msg = String.Format("{0}\n\n{1},{2}", ex.Message, ex.StackTrace, ex.InnerException.StackTrace);
// new Log.GetLogger("APP.xmal").Log.Error("App.TaskScheduler_UnobservedTaskException()" + stringBuilder.ToString());
// WriteError(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff:ffffff") + ": " + stringBuilder.ToString());
//App.Current.Dispatcher.Invoke(() =>
//{
// //MessageBoxResult messageBox = MessageBox.Show(msg, "提示", MessageBoxButton.OK);
// IsClickBtn? value = IsClickBtn.cancel;
// value = LoadError.Show(msg);
// if (value == IsClickBtn.yes)
// {
// }
// // ViewModel.LoadViaViewModel.LoadingViewModel.ExitProcess(0);
//});
}
/// <summary>
/// 提取异常及其内部异常堆栈跟踪
/// </summary>
/// <param name="exception">提取的异常</param>
/// <param name="lastStackTrace">最后提取的堆栈跟踪(对于递归), String.Empty or null</param>
/// <param name="exCount">提取的堆栈数(对于递归)</param>
/// <returns>Syste.String</returns>
private static StringBuilder ExtractAllStackTrace(Exception exception, StringBuilder lastStackTrace = null, int exCount = 1)
{
var ex = exception;
//修复最后一个堆栈跟踪参数
lastStackTrace = lastStackTrace ?? new StringBuilder();
//添加异常的堆栈跟踪
lastStackTrace.Append($"count:{exCount}: {ex.Message}{ex.StackTrace}\n\r");
if (exception.Data.Count > 0)
{
lastStackTrace.Append("Data:");
foreach (var item in exception.Data)
{
var entry = (DictionaryEntry)item;
lastStackTrace.Append($"{entry.Key}: {exception.Data[entry.Key]}\n\r");
}
}
//递归添加内部异常
if ((ex = ex.InnerException) != null)
return ExtractAllStackTrace(ex, lastStackTrace, ++exCount);
return lastStackTrace;
}
}
}

@ -5,6 +5,19 @@
prism:ViewModelLocator.AutoWireViewModel="True" Closing="Window_Closing"
Title="{Binding Title}" Height="500" Width="900" >
<Grid>
<ContentControl prism:RegionManager.RegionName="MainContentRegion" />
<Grid.RowDefinitions>
<RowDefinition Height="60"/>
<RowDefinition Height="100*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="100*"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Background="#FF5E83FF" Orientation="Horizontal">
<Image Source="/StartServerWPF.Modules.Main;component/Images/Union.png" Height="32" Stretch="Uniform" Margin="20,0,30,0"/>
<TextBlock Text="微地震预警系统管理后台" FontSize="30px" Foreground="White" VerticalAlignment="Center"/>
</StackPanel>
<ContentControl prism:RegionManager.RegionName="LeftMenuTreeRegion" Grid.Column="0" Grid.Row="1"/>
<ContentControl prism:RegionManager.RegionName="MainContentRegion" Grid.Column="1" Grid.Row="1" />
</Grid>
</Window>

Loading…
Cancel
Save