PDMS & AM 侧边栏菜单 C# WPF技术
项目的完整下载地址
https://files.cnblogs.com/files/NanShengBlogs/AMCSTest.zip?t=1698491030&download=true
先看效果
下面先看实现的几个函数
1# 创建wpf的用户控件,无选项的参考此链接修改csproject文件
写入下列代码
<UserControl x:Class="AMCSTest.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:AMCSTest" mc:Ignorable="d" MinWidth="85" MinHeight="250" Background="#BFDBFF" > <UserControl.Resources> <ResourceDictionary> <Style x:Key="Expander.StackPanel.Style" TargetType="FrameworkElement"> <Setter Property="HorizontalAlignment" Value="Center"></Setter> </Style> </ResourceDictionary> </UserControl.Resources> <Grid > <ItemsControl ItemsSource="{Binding Dict}"> <ItemsControl.ItemTemplate> <DataTemplate> <Expander IsExpanded="False" Background="Transparent" FontWeight="Bold" IsEnabled="True" Foreground="Black" SnapsToDevicePixels="True" BorderBrush="Black" BorderThickness="0.8" Margin=" 0,2,0,2"> <Expander.Header> <TextBlock Text="{Binding Path=Key}" TextWrapping="Wrap" FontWeight="ExtraBold" FontSize="12"/> </Expander.Header> <ScrollViewer VerticalScrollBarVisibility="Hidden" MaxHeight="300" > <StackPanel HorizontalAlignment="Stretch" Margin=" 0,2,0,2" Orientation="Vertical"> <ItemsControl ItemsSource="{Binding Path=Value }"> <ItemsControl.ItemTemplate> <DataTemplate> <Button Style="{StaticResource Expander.StackPanel.Style}" Tag="{Binding Path=Value}" Click="Button_Click" HorizontalAlignment="Stretch" Margin="0,1,0,1" Background="Transparent" Foreground="Black" FontStyle="Normal" FontWeight="Regular"> <TextBlock Text="{Binding Path=Key}" TextWrapping="Wrap" FontSize="12"> </TextBlock> </Button> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </StackPanel> </ScrollViewer> </Expander> <!--<Button Content="{Binding Path=Key}" Tag="{Binding Path=Value}" Click="Button_Click" HorizontalAlignment="Stretch" Margin="0,1,0,1" Background="#FF1EB856" BorderBrush="#FF64D126" Grid.IsSharedSizeScope="False"/>--> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </Grid> </UserControl>
usercontrol的交互代码
/// <summary> /// UserControl1.xaml 的交互逻辑 /// </summary> public partial class UserControl1 : UserControl { public Command Cmd { get; set; } public WindowManager WinManager { get; set; } public UserControl1(WindowManager wm, Command _cmd) { InitializeComponent(); this.WinManager = wm; this.Cmd = _cmd; } private void Button_Click(object sender, RoutedEventArgs e) { var btn = sender as Button; var mi = btn.Tag as MethodInfo; if (mi.DeclaringType == null) return; try { mi.Invoke( mi.IsStatic ? null : Activator.CreateInstance(mi.DeclaringType), new object[] { WinManager}); } catch (Exception ex) { Interaction.MsgBox(ex.StackTrace); } } }
框架代码
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System.Windows.Forms; using System.Windows.Forms.Integration; //引用AM的dll文件,在AM的安装目录下面 using Aveva.ApplicationFramework; using Aveva.ApplicationFramework.Presentation; using Microsoft.VisualBasic; namespace AMCSTest { public class MianClass : IAddin { public string Description => base.GetType().FullName; public string Name => base.GetType().FullName; public void Start(ServiceManager serviceManager) { var winManager = serviceManager.GetService(typeof(WindowManager)) as WindowManager; 结构工具 dwcmd = new 结构工具(winManager); // var cmdmanager = serviceManager.GetService(typeof(CommandManager)) as CommandManager; //cmdmanager?.Commands.Add(dwcmd); var cbm = serviceManager.GetService(typeof(CommandBarManager)) as CommandBarManager; cbm.AllowCustomization = true; cbm.BeginUpdate(); var cbar = cbm.CommandBars.AddCommandBar(typeof(结构工具).Name);//typeof(结构工具).Name cbar.DockedPosition = DockedPosition.Top; cbar.AllowHiding = false; cbar.AllowFloating = true; var assemblyDate = System.IO.File.GetLastWriteTime(System.Reflection.Assembly.GetExecutingAssembly().Location).ToString("yyyy年MM月dd日-HH点mm分"); cbar.Caption = cbar.Key + $",软件版本({assemblyDate})"; var cur002 = cbm.RootTools.AddButtonTool(nameof(结构工具), nameof(结构工具), null, dwcmd); var btl2 = cbar.Tools.AddTool(nameof(结构工具)) as ButtonTool; cbm.EndUpdate(true); cbm.SaveLayout(); } public void Stop() { } public static Dictionary<string, Dictionary<string,MethodInfo>> GetAllCommand() { Dictionary<string, Dictionary<string, MethodInfo>> dicts = new Dictionary<string, Dictionary<string, MethodInfo>>(); List<Type> allClass = Assembly.GetExecutingAssembly().GetTypes().Where(a => a.IsClass && a.IsPublic).ToList<Type>(); List<MyAMFunction> mis = new List<MyAMFunction>(); foreach (Type item in allClass) { List<MethodInfo> curClsMis = item.GetMethods().Where(m => m.GetCustomAttributes(typeof(MyAmFunctionAtt), true).Any()).ToList<MethodInfo>(); if (curClsMis.Count > 0) { foreach (MethodInfo mi in curClsMis) { mis.Add(new MyAMFunction(mi)); } } } Dictionary<string, Dictionary<string, MethodInfo>> GetAllCommand; if (mis.Count == 0) GetAllCommand = dicts; else { foreach (MyAMFunction item2 in mis) { Dictionary<string, MethodInfo> temp = new Dictionary<string, MethodInfo>(); if (dicts.ContainsKey(item2.Att.MenuName)) { temp = dicts[item2.Att.MenuName]; } temp.Add(item2.Att.FunctionName, item2.Method); dicts[item2.Att.MenuName] = temp; } GetAllCommand = dicts; } return GetAllCommand; } } public class MyAMFunction { public MyAmFunctionAtt Att { get; set; } public MethodInfo Method { get; set; } public MyAMFunction(MethodInfo mi) { this.Att = (MyAmFunctionAtt)mi.GetCustomAttributes(true).First(a => a.GetType().FullName == typeof(MyAmFunctionAtt).FullName); this.Method = mi; } } public class MyAmFunctionAtt : Attribute { public string MenuName { get; set; } public string FunctionName { get; set; } public MyAmFunctionAtt(string _menuNam, string _functionName) { this.MenuName = _menuNam; this.FunctionName = _functionName; } } public class 结构工具 : Command { private DockedWindow _mywin; public 结构工具(WindowManager wm) { base.Key = this.GetType().FullName; var con = new UserControl1(wm, this); AmCommand cmds = new AmCommand { Dict = MianClass.GetAllCommand() }; con.DataContext = cmds; var eh = new ElementHost() { Child = con, AutoSize = true, Dock = DockStyle.Fill }; _mywin = wm.CreateDockedWindow("xxxx", $"xxxx", eh, DockedPosition.Right); _mywin.MaximumSize = new System.Drawing.Size(185, 850); _mywin.MinimumSize = new System.Drawing.Size(135, 850); _mywin.DockGroupStyle = DockGroupStyle.TabGroup; _mywin.SaveLayout = true; wm.WindowLayoutLoaded += (s, e) => this.Checked = false; _mywin.Closed += (s, e) => this.Checked = _mywin.Visible; this.ExecuteOnCheckedChange = false; } public class AmCommand { public Dictionary<string, Dictionary<string, MethodInfo>> Dict { get; set; } = new Dictionary<string, Dictionary<string, MethodInfo>>(); public AmCommand() { } } public override void Execute() { try { if (_mywin.Visible) _mywin.Hide(); else _mywin.Show(); base.Execute(); } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.StackTrace); } } } }
标签:
AVEVA MARINE C#
, PDMS
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!