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

news2024/11/15 20:43:34

因为审美的不同,就总有些奇奇怪怪的需求,使用框架自带的对话框已经无法满足了,这里记录一下我这边初步设计的对话框。别问为啥要用模板嵌套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();//实例化Page
     user.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.coloradmin.cn/o/2154593.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试-设计模式

策略模式 定义了一组算法&#xff0c;分别封装起来&#xff0c;这些算法直接可以相互替换 设计模式的开闭原则&#xff1a;对修改关闭&#xff0c;对扩展开放 装饰模式 将某种算法作为一个装饰品添加到对象身上&#xff0c;同时可以自由穿戴更换装饰品 两个主要的角色&…

C语言 | Leetcode C语言题解之第423题从英文中重建数字

题目&#xff1a; 题解&#xff1a; char * originalDigits(char * s) {int lenstrlen(s);int arr[26]{0},num[10]{0},cot0;for(int i 0; i < len; i)arr[s[i] - a];num[0] arr[z-a];num[2] arr[w-a];num[4] arr[u-a];num[6] arr[x-a];num[8] arr[g-a];num[1] arr[o…

[JavaEE] UDP协议

目录 再谈端口号 一、端口号的划分 二、UDP协议 三、UDP的特点 再谈端口号 一、端口号的划分 0-1023&#xff1a;知名端口号&#xff0c;端口号固定&#xff0c;其中包括HTTP&#xff0c;FTP&#xff0c;SSH等广为使用的应用层协议。 1024-65535&#xff1a;操作系统动态分…

演示jvm锁存在的问题

文章目录 1、AlbumInfoApiController --》testLock()2、redis添加键值对3、AlbumInfoServiceImpl --》testLock() 没有加锁4、使用ab工具测试4.1、安装 ab 工具4.2、查看 redis 中的值 5、添加本地锁 synchronized6、集群情况下问题演示 jvm锁&#xff1a;synchronized lock 只…

面试金典题2.4

给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x 3 输出&a…

LeetCode从入门到超凡(二)递归与分治算法

引言 大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年9月学习赛的LeetCode学习总结文档&#xff1b;在算法设计中&#xff0c;递归和分治算法是两种非常重要的思想和方法。它们不仅在解决复杂问题时表…

matlab绘制二维云图,划分区域,并显示每个区域的均值

绘制成图如下&#xff1a; 代码如下&#xff1a; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%创建绘图的数据 ax0;bx1; ay0;by1; nx100; %数据的x轴点数 ny100; %数据的y轴点数 hx(bx-ax)/(nx-1); hy(by-ay)/(ny-1); Xax:hx:bx; Yay:hy:by; da…

HTTP中的301、302实现重定向

HTTP状态码301和302描述 ‌HTTP状态码301和302用于实现重定向‌&#xff0c;其中301代表永久重定向&#xff0c;而302代表临时重定向。这两种重定向方式在网页开发、搜索引擎优化&#xff08;SEO&#xff09;以及用户体验方面扮演着重要的角色。 301 301永久重定向‌意味着原…

UDS进阶篇

小结&#xff1a;工欲善其事必先利其器&#xff0c;参考成熟的UDS工具&#xff0c;开发及完善控制器UDS诊断配置。 对应到AUTOSAR中&#xff0c;DEM和DCM&#xff0c;利用工具可实现诊断开发标准流程化&#xff0c;从诊断需求到诊断仪及诊断诊断一条龙开发&#xff0c;不断完善…

★ C++进阶篇 ★ 二叉搜索树

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将继续和大家一起学习C进阶篇第三章----二叉搜索树 ~ ❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 澄岚主页&#xff1a;椎名澄嵐-CSDN博客 C基础篇专栏&#xff1a;★ C基础篇 ★_椎名澄嵐的博客-CSD…

fasterRCNN模型实现飞机类目标检测

加入会员社群&#xff0c;免费获取本项目数据集和代码&#xff1a;点击进入>> 关于python哥团队 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师…

写一下线性表

如果你是c语言, "不会"c, 那么... 把iostream当成stdio.h 把cout当成printf, 不用管啥类型, 变量名字一给输出完事 把cin>>当成scanf, 变量名字一给输入完事 把endl当成\n, 换行. 哦对了, malloc已经不建议使用了, 现在使用new, 把new当作malloc, 把delete当…

TCP四大拥塞控制算法总结

四大算法&#xff1a;1.慢启动&#xff0c;2.拥塞避免&#xff0c;3.拥塞发生&#xff0c;4.快速恢复。 慢启动&#xff1a; 首先连接建好的开始先初始化拥塞窗口cwnd大小为1&#xff0c;表明可以传一个MSS大小的数据。 每当收到一个ACK&#xff0c;cwnd大小加一&#xff0c…

链表(单向不带头非循环)

声明 链表题考的都是单向不带头非循环&#xff0c;所以在本专栏中只介绍这一种结构&#xff0c;实际中链表的结构非常多样&#xff0c;组合起来就有8种链表结构。 链表的实现 创建一个链表 注意&#xff1a;此处简单粗暴创建的链表只是为了初学者好上手。 public class MyS…

FreeRtos同步互斥与通信

前言&#xff1a;本篇笔记参考韦东山老师&#xff0c;视屏教程&#xff0c;连接放在最后。 同步与互斥的基本概念 同步&#xff1a;Task_a执行完成之后Task_b才能执行&#xff0c;让任务按照特定的顺序去执行。 互斥&#xff1a;当Task_a访问临界资源进行执行&#xff0c;Task…

(done) 声音信号处理基础知识(2) (重点知识:pitch)(Sound Waveforms)

来源&#xff1a;https://www.youtube.com/watch?vbnHHVo3j124 复习物理知识&#xff1a; 声音由物体的振动产生 物体振动会导致空气分支振荡 某一处的空气气压变化会创造一个波 声音是机械波 空气的振荡在空间中传递 能量从空间中的一个点到另一个点 机械波需要媒介&#x…

LabVIEW编程能力如何能突飞猛进

要想让LabVIEW编程能力实现突飞猛进&#xff0c;需要采取系统化的学习方法&#xff0c;并结合实际项目进行不断的实践。以下是一些提高LabVIEW编程能力的关键策略&#xff1a; 1. 扎实掌握基础 LabVIEW的编程本质与其他编程语言不同&#xff0c;它是基于图形化的编程方式&…

【Taro】初识 Taro

笔记来源&#xff1a;编程导航。 概述 Taro 官方文档&#xff1a;https://taro-docs.jd.com/docs/ &#xff08;跨端开发框架&#xff09; Taro 官方框架兼容的组件库&#xff1a; taro-ui&#xff1a;https://taro-ui.jd.com/#/ &#xff08;最推荐&#xff0c;兼容性最好&…

第四范式发布AIGS Builder企业级软件重构助手,以生成式AI重构企业软件

产品上新 Product Release 今天&#xff0c;第四范式发布企业级软件重构助手——AIGS Builder&#xff0c;可快速重构软件交互体验。传统的企业软件开发&#xff0c;每次迭代通常要以月计。基于第四范式AIGS Builder大模型&#xff0c;用生成式Agent替代复杂的界面&#xff0c;…

为什么 AVIF 将成为下一代图片格式之王

AVIF的卓越优势 AVIF&#xff08;AV1 Image File Format&#xff09;正在迅速崛起&#xff0c;成为下一代网络图片格式的有力竞争者。作为基于AV1视频编码技术的图像格式&#xff0c;AVIF在多个方面展现出了令人瞩目的性能。 1. 卓越的压缩效率 与JPEG和WebP相比&#xff0c…