WPF自定义Dialog模板,内容用不同的Page填充

embedded/2024/11/14 4:36:49/

因为审美的不同,就总有些奇奇怪怪的需求,使用框架自带的对话框已经无法满足了,这里记录一下我这边初步设计的对话框。别问为啥要用模板嵌套Page来做对话框,问就是不想写太多的窗体。。。。

模板窗体(XAML)

<Window x:Class="换成自己的程序集.DialogModel"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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:SCADA"mc:Ignorable="d"WindowStyle="None"WindowStartupLocation="CenterScreen"AllowsTransparency="True"Background="#060931"Foreground="White"Title="DialogModel" Height="450" Width="600"><Window.Resources><Style TargetType="DockPanel" x:Key="DockPanel"><Setter Property="Background" ><Setter.Value><ImageBrush ImageSource="/Images/top.png"/></Setter.Value></Setter></Style><Style TargetType="StackPanel" x:Key="StackPanel"><Setter Property="Background" ><Setter.Value><ImageBrush ImageSource="/Images/tb_1.png"/></Setter.Value></Setter></Style><Style TargetType="Button" x:Key="Button"><Setter Property="Background" ><Setter.Value><ImageBrush ImageSource="/Images/btn1.png"/></Setter.Value></Setter><Setter Property="BorderThickness" Value="0"/><Setter Property="BorderBrush" Value="Transparent"/><Setter Property="Foreground" Value="White"/></Style></Window.Resources><Grid x:Name="MyDialog"><Grid.RowDefinitions><RowDefinition Height="auto"/><RowDefinition/><RowDefinition Height="auto"/></Grid.RowDefinitions><!--头部--><DockPanel x:Name="TOP" Style="{StaticResource DockPanel}" VerticalAlignment="Center" Height="60" Margin="0"><TextBlock Text="{Binding DialogTitle}" Foreground="White" FontSize="20" VerticalAlignment="Center" Margin="20 0 0 0"/><WrapPanel   VerticalAlignment="Center" HorizontalAlignment="Right"><Button Height="20" Margin="5 0 5 0" Width="20" Padding="0"  Background="Transparent" BorderBrush="Transparent" Foreground="White" x:Name="btnMin" Content="—" /><Button Height="20" Margin="5 0 5 0" Width="20" Padding="0" Background="Transparent" BorderBrush="Transparent" Foreground="White" x:Name="btnMax" Content="❐" /><Button Height="20" Margin="5 0 5 0" Width="20" Padding="0" Background="Transparent" BorderBrush="Transparent" Foreground="White" x:Name="btnClose" Content="╳"/></WrapPanel></DockPanel><!--内容--><Frame x:Name="MainFrame" Content="{Binding CurrentPage}" Grid.Row="1" NavigationUIVisibility="Hidden" BorderThickness="0"/><StackPanel Grid.Row="2" Style="{StaticResource StackPanel}" Visibility="{Binding ISVisible}"><WrapPanel  HorizontalAlignment="Right" ><Button  Style="{StaticResource Button}" Margin=" 0 10 20 10" Click="Confirm" Height="40" Width="120" Content="确定" /><Button  Style="{StaticResource Button}" Margin=" 0 10 10 10" Height="40" Width="120" Click="Cancel"   Content="取消" /></WrapPanel></StackPanel></Grid>
</Window>

模板窗体(cs)

/// <summary>
/// DialogModel.xaml 的交互逻辑
/// </summary>
public partial class DialogModel : Window, INotifyPropertyChanged
{public event PropertyChangedEventHandler PropertyChanged;/// <summary>/// 消息通知方法/// </summary>/// <param name="propertyname"></param>public void OnPropertyChanged([CallerMemberName] string propertyname = ""){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyname));}public DialogModel(Page page, string title,string Visible= "Visible"){InitializeComponent();DataContext = this;ISVisible = Visible;CurrentPage = page;DialogTitle = title;btnMin.Click += (s, e) => { this.WindowState = WindowState.Minimized; };btnMax.Click += (s, e) =>{if (this.WindowState == WindowState.Maximized)this.WindowState = WindowState.Normal;else{this.ResizeMode = ResizeMode.NoResize;this.WindowState = WindowState.Maximized;}};btnClose.Click += (s, e) => { this.Close(); };TOP.MouseMove += (s, e) =>{if (e.LeftButton == MouseButtonState.Pressed){this.DragMove();}};}#region 字段属性private string title;/// <summary>/// 对话框标题/// </summary>public string DialogTitle{get { return title; }set{title = value; OnPropertyChanged();}}private Page currentpage;public Page CurrentPage{get { return currentpage; }set{currentpage = value; OnPropertyChanged();}}private string visible;/// <summary>/// 是否显示确认取消按钮组,Visible-显示,Collapsed隐藏/// </summary>public string ISVisible{get { return visible; }set{visible = value; OnPropertyChanged();}}#endregion/// <summary>/// 确认方法,此处未返回值是因为主要内容都在Page里面。业务逻辑都在Page中。你也可以放置在此处,具体如何传值得靠你自己/// </summary>private void Confirm(object sender, RoutedEventArgs e){this.DialogResult = true;this.Close();}/// <summary>/// 取消方法/// </summary>private void Cancel(object sender, RoutedEventArgs e){this.Close();}
}

Page(XAML,引用了materialDesign库,没有的话用你自己定义的page就好)

<Page x:Class="*****.Pages.User"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:SCADA.Pages"xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"mc:Ignorable="d" Foreground="White"d:DesignHeight="450" d:DesignWidth="400"Title="User"><Page.Resources><Style TargetType="Grid" x:Key="Grid"><Setter Property="Background"><Setter.Value><ImageBrush ImageSource="/Images/tb_1.png"/></Setter.Value></Setter></Style></Page.Resources><Grid Style="{StaticResource Grid}"><StackPanel Margin="16" Width="300" HorizontalAlignment="Center" VerticalAlignment="Center"><TextBox Margin="10"  Text="{Binding UserName}"materialDesign:HintAssist.Hint="UserName"/><TextBox Margin="10"  Text="{Binding Account}"materialDesign:HintAssist.Hint="Account"/><TextBox Margin="10"  Text="{Binding PassWord}"materialDesign:HintAssist.Hint="PassWord"/><ComboBox x:Name="CurrentRole" SelectionChanged="RoleChange"  Margin="10"  materialDesign:ComboBoxAssist.MaxLength="2" DisplayMemberPath="Name" SelectedValuePath="Id" ItemsSource="{Binding Roles}" materialDesign:HintAssist.Hint="请选择用户角色" materialDesign:HintAssist.HintOpacity=".26" IsEditable="True"></ComboBox><CheckBox Margin="10" Content="是否启用" IsChecked="{Binding IsActive}" /><StackPanel HorizontalAlignment="Right" Orientation="Horizontal"><Button Margin="0,8,8,0" Click="Confirm" Content="确认"></Button><Button Margin="0,8,8,0"  Click="Cancel" Content="取消"></Button></StackPanel></StackPanel></Grid>
</Page>

Page(.cs)

/// <summary>
/// User.xaml 的交互逻辑
/// </summary>
public partial class User : Page, INotifyPropertyChanged
{#region 通知public event PropertyChangedEventHandler PropertyChanged;/// <summary>/// 消息通知方法/// </summary>/// <param name="propertyname"></param>public void OnPropertyChanged([CallerMemberName] string propertyname = ""){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyname));}#endregion
//这里的数据库用的EF,这里为啥这样写参考我前面的动态配置EF连接字符串的文章,此处可删string SQLConnection = EFConnection.GetConnection(".", "sa", "123456", "XYDB", false);public User(){InitializeComponent();DataContext = this;//必要//下面可删除//Roles = new List<SelectRole>();//Notice.MainUI = Application.Current.MainWindow;//string config = SysConfig.GetConfig(SysConfig.PathBase, "SysSet");//if (config != null)//{//    var mo = JsonConvert.DeserializeObject<SystemSetModel>(config);//    SQLConnection = EFConnection.GetConnection(mo.DbIP, mo.DbAccount, mo.DbPassWord, mo.DbName, false);//}在此初始化所有角色//using (var db = new DBEntities(SQLConnection))//{//    var role = db.SysRoles.Where(m => m.IsActive).ToList();//    if (role != null && role.Count > 0)//    {//        foreach (var item in role)//        {//            SelectRole role1 = new SelectRole();//            role1.Id = item.Id;//            role1.Name = item.RoleName;//            Roles.Add(role1);//        }//    }//}}#region 属性字段private Guid id;/// <summary>/// Id/// </summary>public Guid Id{get { return id; }set{id = value;OnPropertyChanged();//参数可以不写,}}private string username;/// <summary>///用户名/// </summary>public string UserName{get { return username; }set{username = value; OnPropertyChanged();}}private string account;/// <summary>///账号/// </summary>public string Account{get { return account; }set{account = value; OnPropertyChanged();}}private string password;/// <summary>///密码/// </summary>public string PassWord{get { return password; }set{password = value; OnPropertyChanged();}}private bool isactive;/// <summary>/// 状态/// </summary>public bool IsActive{get { return isactive; }set{isactive = value;OnPropertyChanged();}}private bool isadd = true;/// <summary>/// 是否添加用户,用于辨别确认方法是添加还是编辑/// </summary>public bool IsAdd{get { return isadd; }set{isadd = value;OnPropertyChanged();}}private Guid roleid;/// <summary>/// 选定的角色Id/// </summary>public Guid RoleId{get { return roleid; }set{roleid = value;OnPropertyChanged();//参数可以不写,}}private List<SelectRole> roles;/// <summary>/// 可选的角色列表/// </summary>public List<SelectRole> Roles{get { return roles; }set{roles = value;OnPropertyChanged();}}#endregion/// <summary>/// 添加/编辑/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Confirm(object sender, RoutedEventArgs e){try{//下面的逻辑替换成自己的//using (var db = new DBEntities(SQLConnection))//{//    //添加用户//    if (IsAdd)//    {//        var Current = db.SysUsers.FirstOrDefault(m => m.Account == Account);//        if (Current == null)//        {//            SysUser user = new SysUser();//            user.Id = Guid.NewGuid();//            user.Name = UserName;//            user.Account = Account;//            user.PassWord = PassWord;//            user.IsActive = IsActive;//            user.CreateTime = DateTime.Now;//            user.LoginNum = 0;//            user.LoginTime = DateTime.Now;//            User_Role user_Role = new User_Role();//            user_Role.Id = Guid.NewGuid();//            user_Role.UserId = user.Id;//            user_Role.RoleId = RoleId;//            user.User_Role.Add(user_Role);//            db.SysUsers.Add(user);//            db.SaveChanges();//            Notice.SuccessNotification_Dark("添加成功", 20, 5);//            // 获取当前页面所在的窗体//            Window window = Window.GetWindow(this);//            // 检查是否找到窗体并关闭它//            if (window != null)//            {//                window.Close();//            }//        }//        else//        {//            Notice.WarningNotification_Dark($"当前用户账号已存在!", 20, 5);//        }//    }//编辑用户//    else//    {//        var Current = db.SysUsers.FirstOrDefault(m => m.Id != Id && m.Account == Account);//        if (Current == null)//        {//            var User = db.SysUsers.FirstOrDefault(m => m.Id == Id);//            if (User != null)//            {//                db.Entry(User).State = EntityState.Detached;//取消跟踪免得修改主键冲突//                User.Name = UserName;//                User.Account = Account;//                User.PassWord = PassWord;//                User.IsActive = IsActive;//                var role = User.User_Role.FirstOrDefault();//                if (role != null)//有配置角色//                {//                    role.RoleId = RoleId;//                    db.User_Role.Add(role);//                }//                else//无配置角色//                {//                    User_Role userRole = new User_Role();//                    userRole.Id = Guid.NewGuid();//                    userRole.UserId = User.Id;//                    userRole.RoleId = RoleId;//                    db.User_Role.Add(userRole);//                }//                db.Entry(User).State = EntityState.Modified;//                db.SaveChanges();//                Notice.SuccessNotification_Dark("编辑成功", 20, 5);//                // 获取当前页面所在的窗体//                Window window = Window.GetWindow(this);//                // 检查是否找到窗体并关闭它//                if (window != null)//                {//                    window.Close();//                }//            }//            else//            {//                Notice.FailtureNotification_Dark("未找到当前用户", 20, 5);//                return;//            }//        }//        else//        {//            Notice.WarningNotification_Dark($"当前账号已存在!", 20, 5);//        }//    }//}}catch (Exception ex){Notice.FailtureNotification_Dark($"失败:{ex.Message}", 20, 5);}}/// <summary>/// 取消/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Cancel(object sender, RoutedEventArgs e){// 获取当前页面所在的窗体Window window = Window.GetWindow(this);// 检查是否找到窗体并关闭它if (window != null){window.Close();}}private void RoleChange(object sender, SelectionChangedEventArgs e){RoleId=(Guid)CurrentRole.SelectedValue;}
}
public class SelectRole
{public Guid Id { get; set; }public string Name { set; get; }
}

使用方法(供参考):

添加用户:

User user = new User();
DialogModel dialog = new DialogModel(user, "添加用户", "Collapsed");
dialog.ShowDialog();

编辑用户(需要赋值):

 /// <summary>/// DataGird的自定义操作栏的编辑按钮/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void UserEdit(object sender, RoutedEventArgs e){UserInfoDto userInfo = new UserInfoDto();var co = (Control)sender;userInfo = (UserInfoDto)co.DataContext;//获取当前行数据User user = new User();//实例化Pageuser.IsAdd = false;//标识是编辑user.Id = userInfo.Id;//将当前行信息给到Page,绑定到控件user.UserName = userInfo.Name;user.Account = userInfo.Account;user.PassWord = userInfo.PassWord;user.IsActive = userInfo.IsActive;user.RoleId = userInfo.RoleId;for (int i = 0; i < user.Roles.Count; i++){if (user.Roles[i].Id == userInfo.RoleId){if (user.Roles.Count > 1){user.Roles.Remove(user.Roles[i]);user.Roles.Insert(0, user.Roles[i]);}}}DialogModel dialog = new DialogModel(user, "编辑用户", "Collapsed");dialog.ShowDialog();}

最终结果(用到的背景图片啥的我就不贴了,毕竟我觉得不太好看):


http://www.ppmy.cn/embedded/115761.html

相关文章

PyTorch使用------自动微分模块

目录 &#x1f354; 梯度基本计算 1.1 单标量梯度的计算 1.2 单向量梯度的计算 1.3 多标量梯度计算 1.4 多向量梯度计算 1.5 运行结果&#x1f4af; &#x1f354; 控制梯度计算 2.1 控制不计算梯度 2.2 注意: 累计梯度 2.3 梯度下降优化最优解 2.4 运行结果&#x1…

Gmaefi链游系统开发

GameFi链游系统开发是一个涉及多个环节和技术的复杂过程&#xff0c;旨在将区块链技术与游戏行业相结合&#xff0c;创造具有创新性和吸引力的游戏体验。以下是对GameFi链游系统开发的主要步骤和关键要点的详细分析&#xff1a; 一、定义需求和设计 明确游戏理念和玩法&#xf…

基于PHP+MySQL组合开发的在线客服源码系统 聊天记录实时保存 带完整的安装代码包以及搭建部署教程

系统概述 随着互联网技术的飞速发展&#xff0c;企业与客户之间的沟通方式日益多样化&#xff0c;在线客服系统作为连接企业与客户的桥梁&#xff0c;其重要性不言而喻。然而&#xff0c;市场上现有的在线客服系统往往存在成本高、定制性差、维护复杂等问题。针对这些痛点&…

一文读懂HPA弹性扩展自定义指标和缩放策略

一文读懂HPA弹性扩展自定义指标和缩放策略 目录 1 概念 1.1 什么是HPA1.2 HPA 的自定义指标&#xff08;Custom Metrics&#xff09;与扩展1.3 基于多指标的 HPA 1.3.1 工作原理1.3.2 例子&#xff1a;基于 CPU、内存和 QPS 的 HPA 配置 1.4 HPA 的扩缩容行为&#xff08;Beh…

uniapp如何实现图片轮播特效?

前言&#xff1a; 在许多应用程序中&#xff0c;图片轮播特效是一种非常常见且吸引人的功能。使用uniapp&#xff0c;我们可以轻松地实现图片轮播特效&#xff0c;为应用程序增添一定的视觉效果。本文将介绍如何使用uniapp来创建一个简单的图片轮播特效&#xff0c;并提供具体的…

Pandas_groupby_aggregation

在Pandas中&#xff0c;groupby方法经常与agg方法结合使用&#xff0c;以对分组后的数据应用聚合函数。 我的写法 grouped df.groupby(year)[value].mean().reset_index()reset_index 是为了把它转换成dataframe。中括号里的是要算聚合mean的一列。 这相当于SQL的&#xff1…

Flyway 与 Gradle/Maven 集成

Flyway 是一个用于数据库版本控制和迁移的工具&#xff0c;可以通过 SQL 脚本自动化管理数据库结构的变更。为了将 Flyway 更好地融入开发流程&#xff0c;Flyway 可以与 Gradle 或 Maven 构建工具集成&#xff0c;使数据库迁移变得更为高效和自动化。 一、Flyway 与 Gradle 集…

简单多状态dp第三弹 leetcode -买卖股票的最佳时机问题

309. 买卖股票的最佳时机含冷冻期 买卖股票的最佳时机含冷冻期 分析: 使用动态规划解决 状态表示: 由于有「买入」「可交易」「冷冻期」三个状态&#xff0c;因此我们可以选择用三个数组&#xff0c;其中&#xff1a; ▪ dp[i][0] 表示&#xff1a;第 i 天结束后&#xff0c…