开始使用Panuon开源界面库环境配置并手写VS2019高仿界面

news2025/1/16 12:49:57
  • 1. Panuon环境配置
    • 1.1. 通过Nuget 安装 Panuon.WPF.UI
    • 1.2. xaml引用命名空间
    • 1.3. using Panuon.WPF.UI;
  • 2. VS2019 view
    • 2.1. 设置窗体尺寸和title
    • 2.2. 添加静态资源
      • 2.2.1. 什么是静态资源
    • 2.3. 主Grid
      • 2.3.1. 盒子模型
      • 2.3.2. 嵌套布局
  • 3. 总结

1. Panuon环境配置

1.1. 通过Nuget 安装 Panuon.WPF.UI

现在最新的是1.2.4.9,点击安装即可

文章配图

1.2. xaml引用命名空间

修改MainWindow.xaml,引用命名空间xmlns:pu="clr-namespace:Panuon.WPF.UI;assembly=Panuon.WPF.UI"

然后把Window标签改为pu:WindowX

文章配图

1.3. using Panuon.WPF.UI;

在MainWindow.cs中引用命名空间using Panuon.WPF.UI;

同样,需要把基类Window 改为 WindowX, 这样窗体变成了Panuon 窗体了,很简单。

2. VS2019 view

下面我们用panuon开发一个高仿VS2019启动界面,最终成品如下:

文章配图

2.1. 设置窗体尺寸和title

新建WPF工程,按第1节配置panuon环境,然后在pu:WindowX继续添加属性

Title="Visual Studio (SIM)"
Height="630"
Width="1058"
MinHeight="630"
MinWidth="1058"
Background="#252526"
BorderBrush="#3E3E45"
BorderThickness="1"
Foreground="#F1F1F1"

2.2. 添加静态资源

2.2.1. 什么是静态资源

资源可以分为静态资源或动态资源进行引用。

分别是通过使用 StaticResource 标记扩展或 DynamicResource 标记扩展完成的。

StaticResource的用法:

通过替换已定义资源的值(x:Key)来为 XAML 属性提供值。

这里添加静态资源就是可以对单个控件的样式单独控制,定制化。为后面的控件样式所用。


<pu:WindowX.Resources>

    <Style x:Key="SearchComboBoxStyle"
       TargetType="ComboBox"
       BasedOn="{StaticResource {x:Type ComboBox}}">
        <Setter Property="pu:ComboBoxHelper.HoverBorderBrush"
            Value="#007ACC" />
        <Setter Property="pu:ComboBoxHelper.FocusedBorderBrush"
            Value="#007ACC" />
        <Setter Property="Height"
            Value="35" />
        <Setter Property="Width"
            Value="320" />
        <Setter Property="Background"
            Value="#333337" />
        <Setter Property="BorderBrush"
            Value="#3F3F46" />
        <Setter Property="Foreground"
            Value="#F1F1F1" />
    </Style>


    <Style x:Key="CardButtonStyle"
       TargetType="Button"
       BasedOn="{StaticResource {x:Type Button}}">
        <Setter Property="pu:IconHelper.FontFamily"
            Value="{StaticResource PanuonIconFont}" />
        <Setter Property="pu:IconHelper.FontSize"
            Value="30" />
        <Setter Property="pu:IconHelper.VerticalAlignment"
            Value="Top" />
        <Setter Property="pu:IconHelper.Margin"
            Value="7,2,17,0" />
        <Setter Property="pu:ButtonHelper.HoverBackground"
            Value="#3F3F40" />
        <Setter Property="pu:ButtonHelper.ClickBackground"
            Value="{x:Null}" />
        <Setter Property="Foreground"
            Value="#F1F1F1" />
        <Setter Property="Background"
            Value="#333337" />
        <Setter Property="Padding"
            Value="10,7,10,10" />
        <Setter Property="Height"
            Value="75" />
        <Setter Property="VerticalContentAlignment"
            Value="Stretch" />
        <Setter Property="HorizontalContentAlignment"
            Value="Stretch" />
    </Style>


    <Style x:Key="LinkButtonStyle"
       TargetType="Button"
       BasedOn="{StaticResource {x:Type Button}}">
        <Setter Property="pu:IconHelper.FontFamily"
            Value="{StaticResource PanuonIconFont}" />
        <Setter Property="pu:ButtonHelper.HoverBackground"
            Value="{x:Null}" />
        <Setter Property="pu:ButtonHelper.ClickBackground"
            Value="{x:Null}" />
        <Setter Property="Foreground"
            Value="#0097FB" />
        <Setter Property="Background"
            Value="{x:Null}" />
        <Setter Property="Cursor"
            Value="Hand" />
        <Setter Property="VerticalContentAlignment"
            Value="Stretch" />
        <Setter Property="HorizontalContentAlignment"
            Value="Stretch" />
        <Style.Triggers>
            <Trigger Property="IsMouseOver"
                 Value="True">
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <TextBlock Text="{Binding}" 
                                   TextDecorations="Underline"/>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>


    <Style x:Key="ProjectListBoxStyle"
       TargetType="ListBox"
       BasedOn="{StaticResource {x:Type ListBox}}">
        <Setter Property="pu:IconHelper.FontFamily"
            Value="{StaticResource PanuonIconFont}" />
        <Setter Property="pu:IconHelper.Width"
            Value="25" />
        <Setter Property="pu:IconHelper.Height"
            Value="25" />
        <Setter Property="pu:IconHelper.VerticalAlignment"
            Value="Top" />
        <Setter Property="pu:IconHelper.Margin"
            Value="0,-15,7,0" />
        <Setter Property="pu:ListBoxHelper.ItemsHeight"
            Value="65" />
        <Setter Property="pu:ListBoxHelper.ItemsPadding"
            Value="10,0,10,0" />
        <Setter Property="pu:ListBoxHelper.ItemsHoverBackground"
            Value="#3F3F40" />
        <Setter Property="pu:ListBoxHelper.ItemsSelectedBackground"
            Value="{x:Null}" />
        <Setter Property="Foreground"
            Value="#F1F1F1" />
        <Setter Property="Background"
            Value="Transparent" />
        <Setter Property="BorderThickness"
            Value="0" />
        <Setter Property="VerticalContentAlignment"
            Value="Center" />
        <Setter Property="HorizontalContentAlignment"
            Value="Stretch" />
    </Style>


</pu:WindowX.Resources>

2.3. 主Grid

2.3.1. 盒子模型

主Grid里面的布局需要手写,手写需要有一定布局的基础。如果不是很清楚需要先了解下盒子模型。

盒子模型最开始是应用于网页布局,将页面中所有元素都看作是一个盒子,盒子都包含以下几个属性:

width 宽度

height 高度

border 边框——围绕在内边距和内容外的边框

padding 内边距——清除内容周围的区域,内边距是透明的

margin 外边距——清除边框外的区域,外边距是透明的

content 内容——盒子的内容,显示文本和图像

文章配图

2.3.2. 嵌套布局

文章配图

用xaml写布局,当层级嵌套比较深,比较复杂的时候自己都会很晕,这里有个小技巧我经常用,就是给背景/边框标红,这样能直观看到当前的嵌套到哪里了。等找到自己的定位后,在把红色标记去掉。

<Grid Margin="55,0,65,35" Background="Red">

完整的Grid布局代码:


<Grid Margin="55,0,65,35">

    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition />
    </Grid.RowDefinitions>
    <TextBlock Text="Visual Studio 2019 (SIM)"
           FontSize="33"/>
    <Grid Grid.Row="1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition Width="30"/>
            <ColumnDefinition Width="0.6*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition />
        </Grid.RowDefinitions>
        <TextBlock Margin="0,30,0,0"
               Text="Open recent"
               FontSize="20" />
        <Grid Grid.Row="1">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition />
            </Grid.RowDefinitions>
            <ComboBox Margin="0,15,0,0"
                  HorizontalAlignment="Left"
                  IsEditable="True"
                  Style="{StaticResource SearchComboBoxStyle}"
                  pu:ComboBoxHelper.Watermark="Search recent" />
            <ListBox Grid.Row="1"
                 Margin="0,15,0,0"
                 Style="{StaticResource ProjectListBoxStyle}">
                <ListBoxItem pu:ListBoxItemHelper.Icon="/Samples;component/Resources/WebForms.png">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="Auto"/>
                        </Grid.RowDefinitions>
                        <TextBlock FontSize="14"
                               FontWeight="Bold"
                               Text="ProjectA.sln" />
                        <TextBlock VerticalAlignment="Center"
                               HorizontalAlignment="Right"
                               Foreground="#C6C8D2"
                               Text="2021/4/12 12:00" />
                        <TextBlock Grid.Row="1"
                               Margin="0,8,0,0"
                               Text="D:\ProjectA"
                               TextTrimming="CharacterEllipsis"
                               Foreground="#C6C8D2" />
                    </Grid>
                </ListBoxItem>
                <ListBoxItem pu:ListBoxItemHelper.Icon="/Samples;component/Resources/WebForms.png">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
                        <TextBlock FontSize="14"
                               FontWeight="Bold"
                               Text="ProjectB.sln" />
                        <TextBlock VerticalAlignment="Center"
                               HorizontalAlignment="Right"
                               Foreground="#C6C8D2"
                               Text="2021/4/12 12:00" />
                        <TextBlock Grid.Row="1"
                               Margin="0,8,0,0"
                               Text="D:\ProjectB"
                               TextTrimming="CharacterEllipsis"
                               Foreground="#C6C8D2" />
                    </Grid>
                </ListBoxItem>
            </ListBox>
        </Grid>
        <TextBlock Grid.Column="2"
               Margin="0,30,0,0"
               Text="Get started"
               FontSize="20" />
        <StackPanel Grid.Column="2"
                Grid.Row="1"
                Margin="0,15,0,0">
            <Button  Style="{StaticResource CardButtonStyle}"
                 pu:ButtonHelper.Icon="&#xe941;">
                <StackPanel>
                    <TextBlock FontSize="18"
                           Text="Connect to a codespace"/>
                    <TextBlock Margin="0,5,0,0"
                           Text="Create and manage cloud-powered development environments"
                           TextWrapping="Wrap"
                           Foreground="#C6C8D2"/>
                </StackPanel>
            </Button>
            <Button Margin="0,5,0,0"
                Style="{StaticResource CardButtonStyle}"
                 pu:ButtonHelper.Icon="&#xe94d;">
                <StackPanel>
                    <TextBlock FontSize="18"
                           Text="Clone a repository" />
                    <TextBlock Margin="0,5,0,0"
                           Text="Get code from an online repository like GitHub or Azure DevOps"
                           TextWrapping="Wrap"
                           Foreground="#C6C8D2" />
                </StackPanel>
            </Button>
            <Button Margin="0,5,0,0"
                Style="{StaticResource CardButtonStyle}"
                pu:ButtonHelper.Icon="&#xe951;">
                <StackPanel>
                    <TextBlock FontSize="18"
                           Text="Open a project or solution" />
                    <TextBlock Margin="0,5,0,0"
                           Text="Open a local Visual Studio project or .sln file"
                           TextWrapping="Wrap"
                           Foreground="#C6C8D2" />
                </StackPanel>
            </Button>
            <Button Margin="0,5,0,0"
                Style="{StaticResource CardButtonStyle}"
                pu:ButtonHelper.Icon="&#xe956;">
                <StackPanel>
                    <TextBlock FontSize="18"
                           Text="Open a local folder" />
                    <TextBlock Margin="0,5,0,0"
                           Text="Navigate and edit code within any folder"
                           TextWrapping="Wrap"
                           Foreground="#C6C8D2" />
                </StackPanel>
            </Button>
            <Button Margin="0,5,0,0"
                Style="{StaticResource CardButtonStyle}"
                pu:ButtonHelper.Icon="&#xe960;">
                <StackPanel>
                    <TextBlock FontSize="18"
                           Text="Create a new project" />
                    <TextBlock Margin="0,5,0,0"
                           Text="Choose a project template with code scaffolding to get started"
                           TextWrapping="Wrap"
                           Foreground="#C6C8D2" />
                </StackPanel>
            </Button>
            <StackPanel Margin="0,10,0,0"
                    HorizontalAlignment="Center"
                    Orientation="Horizontal">
                <Button Style="{StaticResource LinkButtonStyle}"
                    Content="Continue without code" />
                <TextBlock Text="&#xe90e;"
                       VerticalAlignment="Center"
                       Foreground="#0097FB"
                       FontFamily="{StaticResource PanuonIconFont}"/>
            </StackPanel>
        </StackPanel>
    </Grid>
</Grid>

3. 总结

Panuon.WPF.UI 是一个适用于定制个性化UI界面的组件库。它能帮助你快速完成样式和控件的UI设计,而不必深入了解WPF的 ControlTemplate Storyboard 等知识。

例如,在原生WPF中下,如果你想要修改 Button 按钮 控件的悬浮背景色,你需要修改按钮的 Style 属性,并编写 Trigger Storyboard 来实现悬浮渐变效果。如果你想要更复杂的效果,你可能还需要编写内部的ControlTemplate模板。但现在, Panuon.WPF.UI 为你提供了一个更简单的方式。你只需要在 Button 按钮 控件上添加一条 pu:ButtonHelper.HoverBackground="#FF0000" 属性,即可实现背景色悬浮渐变到红色的效果。Panuon.WPF.UI为每一种控件都提供了大量的属性,使你能够方便地修改WPF中没有直接提供,但在UI设计中非常常用的效果,这有助于你快速地完成UI设计(尤其是在你有设计图的情况下)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2277541.html

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

相关文章

blender导出镜头动作vmd

1 选中相机 2 在相机属性中找到 MMD摄像机工具 3 在弹窗中给 烘焙动画 打勾&#xff08;图中没忘打了&#xff09;点击确定 等待烘焙完成 4 烘焙结束后选中刚刚新增的物体 5 在mmd tools中点击 动作-导出&#xff08;图中已经导出了&#xff0c;故显示灰色&#xff09;

RabbitMQ确保消息可靠性

消息丢失的可能性 支付服务先扣减余额和更新支付状态&#xff08;这俩是同步调用&#xff09;&#xff0c;然后通过RabbitMq异步调用支付服务更新订单状态。但是有些情况下&#xff0c;可能订单已经支付 &#xff0c;但是更新订单状态却失败了&#xff0c;这就出现了消息丢失。…

重生之我在21世纪学C++—string

一、string 概念 string 字符串是一种更加高级的封装&#xff0c;string 字符串中包含大量的方法&#xff0c;这些方法可以使得字符串的操作变得更加简单。如果 string 使用的好&#xff0c;慢慢你就不想使用字符数组来存放字符串了&#xff0c;因为更简单嘛。 C 将字符串直接…

day10_Structured Steaming

文章目录 Structured Steaming一、结构化流介绍&#xff08;了解&#xff09;1、有界和无界数据2、基本介绍3、使用三大步骤(掌握)4.回顾sparkSQL的词频统计案例 二、结构化流的编程模型&#xff08;掌握&#xff09;1、数据结构2、读取数据源2.1 File Source2.2 Socket Source…

x86_64搭建ARM交叉编译工具链

点击上方"蓝字"关注我们 01、下载 >>> GCC 64位交叉编译下载&#xff1a;https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/ 喜欢那个版本自己找 02、简介 >>> 交叉编译器中“交叉”的意思就是在一个架构…

迅翼SwiftWing | ROS 固定翼开源仿真平台正式发布!

经过前期内测调试&#xff0c;ROS固定翼开源仿真平台今日正式上线&#xff01;现平台除适配PX4ROS环境外&#xff0c;也已实现APROS环境下的单机飞行控制仿真适配。欢迎大家通过文末链接查看项目地址以及具体使用手册。 1 平台简介 ROS固定翼仿真平台旨在实现固定翼无人机决策…

IOS界面传值-OC

1、页面跳转 由 ViewController 页面跳转至 NextViewController 页面 &#xff08;1&#xff09;ViewController ViewController.h #import <UIKit/UIKit.h>interface ViewController : UIViewControllerend ViewController.m #import "ViewController.h" …

用 Python 自动化处理日常任务

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…

Linux:地址空间(续)与进程控制

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《Linux&#xff1a;地址空间与进程控制》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 如果本篇文章对你有帮助&#xff0c;还请各位点点赞&#xff0…

链家房价数据爬虫和机器学习数据可视化预测

完整源码项目包获取→点击文章末尾名片&#xff01;

亿道三防丨三防笔记本是什么意思?和普通笔记本的优势在哪里?

三防笔记本是什么意思&#xff1f;和普通笔记本的优势在哪里&#xff1f; 在现代社会中&#xff0c;笔记本电脑已经成为人们工作和生活中不可或缺的一部分。然而&#xff0c;在一些特殊行业或环境中&#xff0c;普通笔记本电脑由于其脆弱性和对环境条件的敏感性&#xff0c;往…

通过proto文件构建 完整的 gRPC 服务端和客户端案例

基础教程-简单案例&#xff08;快入入门java-grpc框架&#xff09; 参考官方入门案例教程&#xff1a;里面我看proto编译&#xff0c;其实直接用maven就能直接将.proto文件编译成java代码。快速入门 | Java | gRPC 框架https://grpc.org.cn/docs/languages/java/quickstart/ …

UML系列之Rational Rose笔记九:组件图

一、新建组件图 二、组件图成品展示 三、工作台介绍 最主要的还是这个component组件&#xff1b; 然后还有这几个&#xff0c;正常是用不到的&#xff1b;基本的使用第四部分介绍一下&#xff1a; 四、基本使用示例 这些&#xff0c;主要是运用package还有package specifica…

K8S 节点选择器

今天我们来实验 pod 调度的 nodeName 与 nodeSelector。官网描述如下&#xff1a; 假设有如下三个节点的 K8S 集群&#xff1a; k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、镜像准备 1.1、镜像拉取 docker pull tomcat:8.5-jre8…

c++领域展开第十二幕——类和对象(STL简介——简单了解STL)超详细!!!!

文章目录 前言STL简介什么是STLSTL的版本STL的六大组件STL的重要性如何学习STL 总结 前言 上篇博客我们了解了初阶的模版函数&#xff0c;以及有关的一些使用方法。 今天我们来了解了解STL库的有关知识 跟我一起上车吧 STL简介 什么是STL STL&#xff1a;是C标准库的重要组成…

Onedrive精神分裂怎么办(有变更却不同步)

Onedrive有时候会分裂&#xff0c;你在本地删除文件&#xff0c;并没有同步到云端&#xff0c;但是本地却显示同步成功。 比如删掉了一个目录&#xff0c;在本地看已经删掉&#xff0c;onedrive显示已同步&#xff0c;但是别的电脑并不会同步到这个删除操作&#xff0c;在网页版…

科研绘图系列:R语言绘制微生物物种系统发育树(phylogenetic tree)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍构成要素有根树与无根树构建方法应用领域说明的问题教程加载R包数据下载导入数据数据预处理系统发育树可视化准备画图数据1. 构建基础系统发育树 `p1`2. 添加条形图 `p2`3. 添加热图…

1️⃣Java中的集合体系学习汇总(List/Map/Set 详解)

目录 01. Java中的集合体系 02. 单列集合体系​ 1. Collection系列集合的遍历方式 &#xff08;1&#xff09;迭代器遍历&#xff08;2&#xff09;增强for遍历​编辑&#xff08;3&#xff09;Lambda表达式遍历 03.List集合详解 04.Set集合详解 05.总结 Collection系列…

微信小程序:跨页面数据修改全攻略

一、引言 在微信小程序开发中&#xff0c;常常会遇到需要在不同页面之间修改数据的情况。比如在商品详情页添加商品到购物车后&#xff0c;购物车页面需要实时更新商品数量和总价&#xff1b;在用户设置页面修改了个人信息&#xff0c;首页的用户信息展示区域也需要同步更新。…

寒假第一次牛客周赛 Round 76回顾

AC数&#xff1a;2&#xff08;A、C&#xff09; B 思路&#xff1a; 等价于求&#xff1a; 数量最多的字符 #include<stdio.h> int main() {int n,num;int a[26]{0};//用于存储字母 a 到 z 的出现次数。scanf("%d",&n);char s[n];scanf("%s",s)…