WPF调用webapi并展示数据(一):WPF页面的构建

有错误欢迎大家给我指正

本项目为WPF+Prism+net6.0

RestSharp调用API

UI为MaterialDesignThemes

EF Core自动生成数据库

效果展示:

项目启动后点击待办事项进入数据展示页

源码地址:绎Ronion/WPF.ToDo (gitee.com)

1.准备

1.1创建WPF项目

1.2 创建完成后,下载Nuget包:Prism.DryIoc、MaterialDesignThemes、Newtonsoft.Json

2.App.xaml的修改

2.1 添加

xmlns:prism="http://prismlibrary.com/"xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"

2.2 把最外层的Application标签改为prism:PrismApplication

2.3 引入资源文件,并删除StartupUri(不删除会重复加载,导致出现两个窗体)

App.xaml全文如下:

<prism:PrismApplication x:Class="ToDoDemo.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:ToDoDemo"xmlns:prism="http://prismlibrary.com/"xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"><Application.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><materialDesign:BundledTheme BaseTheme="Dark" PrimaryColor="DeepPurple" SecondaryColor="Lime" /><ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" /></ResourceDictionary.MergedDictionaries></ResourceDictionary></Application.Resources>
</prism:PrismApplication>

3.主页面

3.1 新建文件夹Views,在文件夹内新建窗口MainView.xaml(删除默认窗口)

3.2引用MaterialDesignThemes和Prism

xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"xmlns:prism="http://prismlibrary.com/"

主页面最终引用:

WindowStartupLocation="CenterScreen" 启动时居中
WindowStyle="None"隐藏边框
AllowsTransparency="True"隐藏白边

<Window x:Class="ToDoDemo.Views.MainView"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:ToDoDemo.Views"xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"xmlns:i="http://schemas.microsoft.com/xaml/behaviors"xmlns:prism="http://prismlibrary.com/"xmlns:ext="clr-namespace:ToDoDemo.Extensions"mc:Ignorable="d"Height="450" Width="800"WindowStyle="None"AllowsTransparency="True"WindowStartupLocation="CenterScreen">
</Window>

3.3 这里设定为,点击导航栏的待办事项跳转到待办页,所以会用到UI组件的部分组件,会直接引用,我会把所有的代码贴出来

UI的源码地址,感兴趣的可以详细了解:

Releases · MaterialDesignInXAML/MaterialDesignInXamlToolkit (github.com)

3.4在App.xaml的</ResourceDictionary.MergedDictionaries>下添加样式资源

<Style x:Key="MyListBoxItemStyle" TargetType="ListBoxItem"><Setter Property="MinHeight" Value="40" /><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type ListBoxItem}"><Grid><Border x:Name="borderHeader" /><Border x:Name="border" /><ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" /></Grid><ControlTemplate.Triggers><Trigger Property="IsSelected" Value="True"><Setter TargetName="borderHeader" Property="BorderThickness" Value="4,0,0,0" /><Setter TargetName="borderHeader" Property="BorderBrush" Value="{DynamicResource PrimaryHueLightBrush}" /><Setter TargetName="border" Property="Background" Value="{DynamicResource PrimaryHueLightBrush}" /><Setter TargetName="border" Property="Opacity" Value="0.2" /></Trigger><Trigger Property="IsMouseOver" Value="True"><Setter TargetName="border" Property="Background" Value="{DynamicResource PrimaryHueLightBrush}" /><Setter TargetName="border" Property="Opacity" Value="0.2" /></Trigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter>
</Style>

3.5创建文件夹Common,在里面创建新文件MenuBar

/// <summary>
/// 系统导航菜单实体类
/// </summary>
public class MenuBar : BindableBase
{private string icon;/// <summary>/// 菜单图标/// </summary>public string Icon{get { return icon; }set { icon = value; }}private string title;/// <summary>/// 菜单名称/// </summary>public string Title{get { return title; }set { title = value; }}private string nameSpace;/// <summary>/// 菜单命名空间/// </summary>public string NameSpace{get { return nameSpace; }set { nameSpace = value; }}
}

3.6创建文件夹Extensions,在里面创建新文件PrismManager

public static class PrismManager
{/// <summary>/// 首页区域/// </summary>public static readonly string MainViewRegionName = "MainViewRegion";/// <summary>/// 设置页区域/// </summary>public static readonly string SettingsViewRegionName = "SettingsViewRegion";
}

3.7创建文件夹ViewModels,在里面创建新文件MainViewModel

public class MainViewModel : BindableBase
{public MainViewModel(IRegionManager regionManager){MenuBars = new ObservableCollection<MenuBar>();CreateMenuBar();NavigateCommand = new DelegateCommand<MenuBar>(Navigate);this.regionManager = regionManager;}private void Navigate(MenuBar obj){if (obj == null || string.IsNullOrWhiteSpace(obj.NameSpace))return;regionManager.Regions[PrismManager.MainViewRegionName].RequestNavigate(obj.NameSpace, back =>{});}public DelegateCommand<MenuBar> NavigateCommand { get; private set; }//做导航private readonly IRegionManager regionManager;//ObservableCollection是一个动态属性集合,可以动态地添加和删除其中的元素private ObservableCollection<MenuBar> menuBars;//动态属性集合public ObservableCollection<MenuBar> MenuBars{get { return menuBars; }set{menuBars = value;RaisePropertyChanged();//通知属性值发生了变化}}void CreateMenuBar(){MenuBars.Add(new MenuBar() { Icon = "Home", Title = "首页", NameSpace = "IndexView" });MenuBars.Add(new MenuBar() { Icon = "NotebookOutline", Title = "待办事项", NameSpace = "ToDoView" });MenuBars.Add(new MenuBar() { Icon = "NotebookPlus", Title = "备忘录", NameSpace = "MemoView" });MenuBars.Add(new MenuBar() { Icon = "Cog", Title = "设置", NameSpace = "SettingsView" });}}

3.8在Views创建ToDoView,在ViewModels创建ToDoViewModel

3.9在App.xaml.cs注册,注意把Application改为PrismApplication

public partial class App : PrismApplication
{protected override Window CreateShell(){return Container.Resolve<MainView>();}protected override void RegisterTypes(IContainerRegistry containerRegistry){containerRegistry.RegisterForNavigation<ToDoView, ToDoViewModel>();}
}

3.10主页的全部代码如下

<Window x:Class="ToDoDemo.Views.MainView"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:ToDoDemo.Views"xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"xmlns:i="http://schemas.microsoft.com/xaml/behaviors"xmlns:prism="http://prismlibrary.com/"xmlns:ext="clr-namespace:ToDoDemo.Extensions"mc:Ignorable="d"Height="450" Width="800"WindowStyle="None"AllowsTransparency="True"WindowStartupLocation="CenterScreen"><materialDesign:DialogHost DialogTheme="Inherit" Identifier="RootDialog" SnackbarMessageQueue="{Binding ElementName=MainSnackbar, Path=MessageQueue}"><materialDesign:DrawerHost x:Name="drawerHost"  IsLeftDrawerOpen="{Binding ElementName=MenuToggleButton, Path=IsChecked}"><materialDesign:DrawerHost.LeftDrawerContent><DockPanel MinWidth="220"><!--侧边栏--><ListBox ItemContainerStyle="{StaticResource MyListBoxItemStyle}"ItemsSource="{Binding MenuBars}" x:Name="menuBar"><i:Interaction.Triggers><i:EventTrigger EventName="SelectionChanged"><i:InvokeCommandAction Command="{Binding NavigateCommand}"CommandParameter="{Binding ElementName=menuBar,Path=SelectedItem}"/></i:EventTrigger></i:Interaction.Triggers><ListBox.ItemTemplate><DataTemplate><StackPanel Background="Transparent" Orientation="Horizontal"><materialDesign:PackIcon Margin="15,0" Kind="{Binding Icon}"/><TextBlock Text="{Binding Title}" Margin="10,0"/></StackPanel></DataTemplate></ListBox.ItemTemplate></ListBox></DockPanel></materialDesign:DrawerHost.LeftDrawerContent><DockPanel><materialDesign:ColorZone Padding="16" x:Name="ColorZone"materialDesign:ElevationAssist.Elevation="Dp4"DockPanel.Dock="Top" Mode="PrimaryMid"><DockPanel LastChildFill="True"><!--最小化、最大化、关闭--><StackPanel DockPanel.Dock="Right" Orientation="Horizontal"><Button x:Name="btnMin" Content="—" Style="{StaticResource MaterialDesignFlatMidBgButton}" /><Button x:Name="btnMax" Content="☐" Style="{StaticResource MaterialDesignFlatMidBgButton}" /><Button x:Name="btnClose" Content="✕" Style="{StaticResource MaterialDesignFlatMidBgButton}" /></StackPanel><!--三横杠--><StackPanel Orientation="Horizontal"><ToggleButton x:Name="MenuToggleButton" IsChecked="False"AutomationProperties.Name="HamburgerToggleButton"Style="{StaticResource MaterialDesignHamburgerToggleButton}" /></StackPanel></DockPanel></materialDesign:ColorZone><ContentControl prism:RegionManager.RegionName="{x:Static ext:PrismManager.MainViewRegionName}" /></DockPanel></materialDesign:DrawerHost></materialDesign:DialogHost>
</Window>

3.6在MainView.xaml.cs内,添加各个按钮的事件

public MainView()
{InitializeComponent();//点击导航栏后收回menuBar.SelectionChanged += (s, e) =>{drawerHost.IsLeftDrawerOpen = false;};//最小化btnMin.Click += (s, e) => { this.WindowState = WindowState.Minimized; };//最大化btnMax.Click += (s, e) =>{if (this.WindowState == WindowState.Maximized)this.WindowState = WindowState.Normal;elsethis.WindowState = WindowState.Maximized;};//关闭btnClose.Click += async (s, e) =>{this.Close();};//拖动窗口ColorZone.MouseMove += (s, e) =>{if (e.LeftButton == MouseButtonState.Pressed)this.DragMove();};//双击放大/缩小ColorZone.MouseDoubleClick += (s, e) =>{if (this.WindowState == WindowState.Normal)this.WindowState = WindowState.Maximized;elsethis.WindowState = WindowState.Normal;};
}

 第二篇:WPF调用webapi并展示数据(二):类库实体类的构建-CSDN博客

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

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

相关文章

Axure 入门文档 文件格式 全局样式 元件居中

文件格式 .rp 原型文件.rplib:元件库文件.rpteam 团队项目文件.html 项目网页文件 批量设置居中 选中多个&#xff0c;然后上方任务栏即可设置 设置自定义页面视图尺寸 项目-自适应视图设置 点击页面空白处就可以使用 添加元件说明 当一个元件创建好&#xff0c;可以设…

[R] Underline your idea with ggplot2

Preview: # 介绍&#xff1a;之前的教程中&#xff0c;我们学习了如何使条形图或直方图看起来更好 比如&#xff1a; 1. How to select a graph calibrate the geom part 2. How to select variables calibrate the aes part 3. How to add a title calibrate the labs …

指针乐园----上

大家好&#xff0c;我是Beilef&#xff0c;许久未见还请多多关照。 文章目录 目录 文章目录 前言 一、指针是什么 二、指针的运用 1.指针变量和地址 2.指针变量和解引⽤操作符&#xff08;*&#xff09; 解引用操作符 3.指针变量类型及意义 3.2指针的-整数 3.3 void* 指针 …

docker-compose Install Dockge

Dockge Dockge 是一个精美的、易于使用的、反应式的自托管 docker compose.yaml 面向堆栈的管理器。 主要特性: 通过Web页面管理compose.yaml文件。 创建/编辑/启动/停止/重新启动/删除容器。更新Docker镜像。交互式Web终端。响应式设计,实时更新进度(Pull/Up/Down)和Web…

Win11桌面出现的这个图标“了解此图片”怎么关闭?

&#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f609; 在csdn获奖荣誉: &#x1f3c6;csdn城市之星2名 ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ …

Java开发手册,java高并发高可用面试题

前言 今年我也33了&#xff0c;离传说中不好找工作的35岁又更近了。说没有焦虑是对自己撒谎&#xff0c;于是我采访了一些人&#xff0c;自己思考了下&#xff0c;写下了这篇文章&#xff0c;希望能有些共鸣。 先看看大家的态度&#xff1a; 色老力衰&#xff0c;不好忽悠&a…

rt-thread uart驱动

uart驱动描述基于GD32F470芯片。 rt-thread提供了一套I/O设备模型&#xff0c;如果想要使用操作系统的驱动去进行操作&#xff0c;就得将具体芯片的硬件驱动注册到设备驱动框架上。 关于rt-thread的I/O设备模型相关内容可以参考 rt-thread I/O设备模型-CSDN博客文章浏览阅读55…

vue命令行

书接上回&#xff0c;一直没能将vue-shop-master项目启动&#xff0c;还是停留在命令行&#xff0c;现参考链接如下&#xff0c; https://blog.csdn.net/jieyucx/article/details/127915699 止步不前了&#xff0c;晚上再摸索吧&#xff0c;搞电商去。。。。溜了溜了&#x…

MySQL进阶之(四)InnoDB数据存储结构之行格式

四、InnoDB数据存储结构之行格式 4.1 行格式的语法4.2 COMPACT 行格式4.2.1 记录的额外信息01、变长字段长度列表02、NULL 值列表03、记录头信息 4.2.2 记录的真实数据 4.3 Dynamic 和 Compressed 行格式4.3.1 字段的长度限制4.3.2 行溢出4.3.3 Dynamic 和 Compressed 行格式 4…

【Flutter 】get-cli init报错处理

报错内容 get init 命令跳出,报错内如下 Select which type of project you want to creat Synchronous waiting using dart:cli waitFor Unhandled exceotion . Dart WaitforEvent is deprecated and disabled by default. This feature will be fully removed in Dart 3.4 …

【定岗定编】某度假村酒店客房部定岗定编管理咨询项目纪实

该度假村酒店由于地域广阔&#xff0c;将客服部分为了四个不同区域&#xff0c;这样就导致了在不同的区域员工的接待量不均衡的状况&#xff0c;引起了员工的强烈不满。如何合理地配置客户部人员以及如何合理地鉴定员工的工作量成为该酒店所面临的两大难题。让我们来看看在人力…

vulhub中ThinkPHP5 SQL注入漏洞 敏感信息泄露

漏洞原理 传入的某参数在绑定编译指令的时候又没有安全处理&#xff0c;预编译的时候导致SQL异常报错。然而thinkphp5默认开启debug模式&#xff0c;在漏洞环境下构造错误的SQL语法会泄漏数据库账户和密码 启动后&#xff0c;访问http://your-ip/index.php?ids[]1&ids[]2…

即插即用篇 | YOLOv8 引入 NAM 注意力机制 | 《NAM: Normalization-based Attention Module》

论文名称:《NAM: Normalization-based Attention Module》 论文地址:https://arxiv.org/pdf/2111.12419.pdf 代码地址:https://github.com/Christian-lyc/NAM 文章目录 1 原理2 源代码3 添加方式4 模型 yaml 文件template-backbone.yamltemplate-small.yamltemplate-large…

C++之类型转换

C语言中的类型转换 在C语言中, 如果赋值运算符左右两侧类型不同, 或者形参与实参类型不匹配, 或者返回值类型与 接收返回值类型不一致时, 就需要发生类型转化, C语言中总共有两种形式的类型转换: 隐式类型转换和显式类型转换 1. 隐式类型转化是关联度很强, 意义相近的类型之间…

【CSP试题回顾】201512-2-消除类游戏

CSP-201512-2-消除类游戏 解题思路 输入棋盘大小和颜色: 首先&#xff0c;程序从标准输入读取两个整数n和m&#xff0c;分别代表棋盘的行数和列数。然后&#xff0c;程序读取接下来的n行输入&#xff0c;每行包含m个整数&#xff0c;代表棋盘上每个方格中的棋子颜色。 初始化…

[蓝桥杯 2017 省 A] 油漆面积 Java代码及一些个人理解

[蓝桥杯 2017 省 A] 油漆面积 题目描述 X 星球的一批考古机器人正在一片废墟上考古。 该区域的地面坚硬如石、平整如镜。 管理人员为方便&#xff0c;建立了标准的直角坐标系。 每个机器人都各有特长、身怀绝技。它们感兴趣的内容也不相同。 经过各种测量&#xff0c;每个…

【论文速读】 | AI驱动修复:漏洞自动化修复的未来

本次分享论文为&#xff1a;AI-powered patching: the future of automated vulnerability fixes 基本信息 原文作者&#xff1a;Jan Nowakowski, Jan Keller 作者单位&#xff1a;Google Security Engineering 关键词&#xff1a;AI, 安全性漏洞, 自动化修复, LLM, sanitiz…

Objective-C blocks 概要

1.block的使用 1.1什么是block&#xff1f; Blocks是C语言的扩充功能&#xff1a;带有自动变量&#xff08;局部变量&#xff09;的匿名函数。 “带有自动变量”在Blocks中表现为“截取自动变量" “匿名函数”就是“不带名称的函数” 块&#xff0c;封装了函数调用及调用…

全方位碾压chatGPT4的全球最强模型Claude 3发布!速通指南在此!保姆级教学拿脚都能学会!

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…

Android开发岗还不会这些问题,温故而知新

前言 前前后后经历过大项目、小项目&#xff0c;跨平台&#xff0c;小程序&#xff0c;Nodejs服务等等&#xff0c;目前在做的Rom开发&#xff0c;定制各种手机中的奇葩需求&#xff0c;从应用层到Framework层&#xff0c;再到C层&#xff0c;再到驱动&#xff0c;最终到Linux&…