xceed PropertyGrid 如何做成Visual Studio 的属性窗口样子

server/2025/1/23 8:24:48/

类似这样的,我百度了一下,发现使用Xceed 不错。使用PropertyGrid

前台代码为

<Windowx:Class="WpfApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:local="clr-namespace:WpfApp"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"Title="PropertyGrid Event Example"Width="800"Height="450"d:DataContext="{d:DesignInstance Type=local:MainViewModel}"mc:Ignorable="d"><Window.Resources><!--  定义转换器  --><local:CommandItemToCommandConverter x:Key="CommandItemToCommandConverter" /><!--  定义模板  --><DataTemplate x:Key="EventEditTemplate"><StackPanel Orientation="Horizontal"><!--  下拉框选择命令  --><ComboBoxWidth="150"DisplayMemberPath="Name"ItemsSource="{Binding DataContext.ButtonViewModel.Commands, RelativeSource={RelativeSource AncestorType=Window}}"SelectedItem="{Binding DataContext.ButtonViewModel.EventClick, RelativeSource={RelativeSource AncestorType=Window}, Converter={StaticResource CommandItemToCommandConverter}, Mode=TwoWay}" /></StackPanel></DataTemplate></Window.Resources><StackPanel Orientation="Vertical"><!--  PropertyGrid that binds to the Button object  --><xctk:PropertyGrid Name="MyPropertyGrid" SelectedObject="{Binding ButtonViewModel}"><xctk:PropertyGrid.EditorDefinitions><xctk:EditorTemplateDefinition EditingTemplate="{StaticResource EventEditTemplate}" TargetProperties="EventClick" /></xctk:PropertyGrid.EditorDefinitions></xctk:PropertyGrid><ButtonWidth="100"Height="100"Command="{Binding ButtonViewModel.EventClick, NotifyOnSourceUpdated=True}"Content="sub" /></StackPanel>
</Window>

后台代码为

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Globalization;
using System.IO;
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.Interactivity;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xaml;
using static WpfApp.ButtonViewModel;namespace WpfApp
{public partial class MainWindow : Window{public MainWindow(){InitializeComponent();DataContext = new MainViewModel(); // Set the DataContext to ViewModel}}public class MainViewModel{public ButtonViewModel ButtonViewModel { get; }public MainViewModel(){ButtonViewModel = new ButtonViewModel();}}public class CommandItemToCommandConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){// 将 ICommand 转换回 CommandItemif (value is ICommand command){var viewModel = Application.Current.MainWindow.DataContext as ButtonViewModel;if (viewModel != null){return viewModel.Commands.FirstOrDefault(item => item.Command == command);}}return null;}public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){// 从 CommandItem 提取 ICommandif (value is CommandItem commandItem){return commandItem.Command;}return null;}}public class CommandItem{public string Name { get; set; }public ICommand Command { get; set; }}public class ButtonViewModel : INotifyPropertyChanged{private ICommand _eventClick;public ObservableCollection<CommandItem> Commands { get; set; }public ICommand EventClick{get => _eventClick;set{_eventClick = value;OnPropertyChanged(nameof(EventClick));}}public ButtonViewModel(){Commands = new ObservableCollection<CommandItem>{new CommandItem{Name = "Say Hello",Command = new RelayCommand(_ => MessageBox.Show("Hello!"))},new CommandItem{Name = "Say Goodbye",Command = new RelayCommand(_ => MessageBox.Show("Goodbye!"))}};// 初始化默认命令EventClick = Commands.FirstOrDefault()?.Command;}public event PropertyChangedEventHandler PropertyChanged;protected void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}}public class RelayCommand : ICommand{private readonly Action<object> _execute;private readonly Predicate<object> _canExecute;public RelayCommand(Action<object> execute) : this(execute, null){ }public RelayCommand(Action<object> execute, Predicate<object> canExecute){_execute = execute ?? throw new ArgumentNullException(nameof(execute));_canExecute = canExecute;}public bool CanExecute(object parameter){return true;}public void Execute(object parameter){_execute(parameter);}public event EventHandler CanExecuteChanged{add { CommandManager.RequerySuggested += value; }remove { CommandManager.RequerySuggested -= value; }}}
}

这是一个完整可以运行的例子。其实要做成vs 那样的,路途很遥远,这里只是举个例子,需要重写很多模板,像前面的代码中就是定义了Event 选择的模板

 实际运行效果如下:


http://www.ppmy.cn/server/160685.html

相关文章

《C++ primer plus》第六版课后编程题-第03章

第三章 1 #include <iostream> using namespace std;const int number 12;int main() {cout << "请输入你的身高&#xff0c;单位为英寸" << endl;int inch, feet;cin >> inch;feet inch / number;inch inch % number;cout << &q…

PyTest自学 - pytest的各种执行方式

<< 返回目录 1 PyTest自学 - pytest的各种执行方式 不带任何参数执行   在命令行下将目录切换到测试用例所在目录&#xff0c;执行pytest tyyDESKTOP-G7V9IT0 ~ $ cd /cygdrive/d/TYYSOFT/Study/Python/pytesttyyDESKTOP-G7V9IT0 /cygdrive/d/TYYSOFT/Study/Python/…

风电可视化管理,数字孪生智慧风机

采用图扑数字孪生实现智慧风机运行状态的模拟和分析&#xff0c;提升风能发电效率与可靠性&#xff0c;实现智能运维与预测性维护&#xff0c;推动风能行业向更高效、更可持续的发展迈进。

岁序更新:香港峰会 - 以中国创新元素 引领AI数据安全新时代!

在新春佳节前夕&#xff0c;2025年1月15日&#xff0c;天空卫士在香港九龙香格里拉酒店隆重举办“以中国创新元素 引领AI数据安全新时代”为主题的交流会&#xff0c;为香港数字安全领域注入创新活力。 天空卫士2022年进驻香港市场&#xff0c;短短2年时间赢得了香港数字安全生…

【设计模式】JAVA 策略 工厂 模式 彻底告别switch if 等

【设计模式】JAVA 策略 工厂 模式 彻底告别switch if 等 目录 【设计模式】JAVA 策略 工厂 模式 彻底告别switch if 等 优势 适用场景 项目结构 关键代码 优势 消除 switch&#xff1a;将分支逻辑分散到独立的策略类中。 开闭原则&#xff1a;新增类型只需添加新的 TypeHa…

Powershell语言的云计算

PowerShell与云计算&#xff1a;新时代的自动化管理工具 在当今快速发展的信息技术时代&#xff0c;云计算已经成为企业和个人计算资源的主要选择。随着云服务的普及&#xff0c;如何高效地管理和自动化云环境中的资源&#xff0c;成为了IT管理员和开发者们面临的重要挑战。Po…

mq_open创建队列失败

mq_open创建队列失败 Error creating message queue: Invalid argument 问题&#xff1a;linux中mq_open创建队列失败&#xff0c;提示该问题&#xff0c;怎么解决 原因&#xff1a;队列名&#xff08;name&#xff09;问题&#xff1a; 1&#xff09;POSIX消息队列名必须以…

Python 轻松扫描,快速检测:高效IP网段扫描工具全解析

Python 轻松扫描&#xff0c;快速检测&#xff1a;高效IP网段扫描工具全解析 相关资源文件已经打包成EXE文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例&#xff0c;秉着…