乐于分享
好东西不私藏

C# WPF进阶特性:深入理解样式与模板之控件模板

C# WPF进阶特性:深入理解样式与模板之控件模板

大家好!想从WinForm换个"赛道"到WPF吗?这个学习合集就是你的专属导航!不敢说写得有多精彩,但我会用心分享:从最基础的语法开始,连招带看、手把手教你从WinForm平稳过渡到WPF,无论你是新手还是有经验的开发者,这里都有属于你的学习路径!

🎯 你是不是也遇到过这些抓狂的时刻?

做WPF项目的时候,产品经理拿着一张设计稿过来说:"这个按钮要做成圆角的,悬停变色,点击有波纹效果。"然后你打开代码,发现默认的Button长这样——方方正正,毫无生气。

改样式?Style只能改颜色、字体、边距,根本动不了控件的骨架。于是你开始Google,翻StackOverflow,最后发现一个词:ControlTemplate(控件模板)

这玩意儿,才是WPF外观定制的真正核武器。

我在项目中统计过,超过60%的UI定制需求,Style解决不了,必须上ControlTemplate。而很多开发者在第一次接触它时,往往因为概念模糊、结构复杂而望而却步,白白浪费了WPF最强大的特性之一。

读完这篇文章,你将掌握:

  • • ControlTemplate的底层机制与工作原理
  • • 3个渐进式实战方案(从简单改造到完全重绘)
  • • 常见踩坑点与规避策略

🔍 问题深度剖析:Style能做什么,做不到什么?

很多同学刚开始学WPF,把Style和ControlTemplate混为一谈,这是第一个误区。

Style(样式) 的本质是属性集合——它能批量设置控件的BackgroundFontSizeMarginPadding等依赖属性,也能通过触发器(Trigger)响应状态变化。但它改不了控件的视觉结构,因为控件的视觉结构由ControlTemplate决定。

换个比喻:Style是给一栋房子刷漆、换地板、装窗帘;而ControlTemplate是重新设计这栋房子的建筑图纸,连墙的位置都能改。

WPF中每个控件(Button、TextBox、ListBox等)都有一个默认的ControlTemplate,由系统主题提供。这个模板定义了控件长什么样、由哪些元素组成。当你需要彻底改变控件的外观时,就必须替换这个模板。

常见的错误认知:

  • • ❌ "用Style加个圆角就行了" → Border的CornerRadius不是Button的直接属性,Style改不到
  • • ❌ "ControlTemplate太复杂,能不用就不用" → 一旦UI需求复杂,逃不掉的
  • • ❌ "重写模板会丢失控件功能" → 只要正确使用TemplatePart和TemplateBinding,功能完全保留

💡 核心要点提炼:ControlTemplate的底层机制

🧱 视觉树与逻辑树的分离

WPF有两棵树:逻辑树(LogicalTree) 和 视觉树(VisualTree)。逻辑树描述控件的层次关系,视觉树描述实际渲染的元素结构。ControlTemplate替换的正是控件的视觉树部分,而逻辑树保持不变。

这意味着:你完全重写了Button的外观,但Button的Click事件、Command绑定、IsEnabled状态依然正常工作。逻辑与视觉彻底解耦,这是WPF架构最优雅的地方之一。

🔗 TemplateBinding:模板与控件的数据桥梁

在ControlTemplate内部,子元素无法直接读取外部控件的属性。这时就需要TemplateBinding——它是一种专为模板设计的单向绑定,性能比普通Binding更高(不需要反射查找,编译时确定)。

xml1<!-- TemplateBinding示例:将控件的Background传递给模板内的Border -->2<Border Background="{TemplateBinding Background}"3        CornerRadius="8"/

🎯 ContentPresenter:内容的占位符

对于ContentControl(Button、Label等),模板内必须有一个ContentPresenter来告诉WPF"把控件的Content放在这里"。少了它,你设置的Button文字或图标就消失了。

🔄 VisualStateManager:状态驱动的现代方案

相比老式的Trigger,VisualStateManager(VSM) 是更现代、更推荐的状态管理方式。它将控件状态(Normal、MouseOver、Pressed、Disabled)与视觉变化解耦,支持平滑动画过渡,代码可读性更强。


🚀 解决方案设计:三个渐进式实战方案

方案一:基础改造——圆角渐变按钮

应用场景: 替换系统默认按钮外观,实现圆角、渐变背景、悬停效果,适合大多数业务系统的通用按钮定制。

csharp1// 测试环境:.NET 8 + WPF,Windows 11,Visual Studio 20222// 以下XAML定义一个完整的圆角渐变Button模板
xml1<Window x:Class="AppWpfTemplate.MainWindow"2        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"3        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"4        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"5        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"6        xmlns:local="clr-namespace:AppWpfTemplate"7        mc:Ignorable="d"8        Title="MainWindow" Height="450" Width="800"9    <Window.Resources10        <Style x:Key="RoundedButtonStyle" TargetType="Button"11            <Setter Property="Template"12                <Setter.Value13                    <ControlTemplate TargetType="Button"14                        <Border x:Name="border"15                            CornerRadius="8"16                            BorderThickness="0"17                            Padding="{TemplateBinding Padding}"18<!-- 渐变背景 -->19                            <Border.Background20                                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1"21                                    <GradientStop Color="#4A90E2" Offset="0"/22                                    <GradientStop Color="#357ABD" Offset="1"/23                                </LinearGradientBrush24                            </Border.Background2526<!-- 内容区域 -->27                            <ContentPresenter HorizontalAlignment="Center"28                                          VerticalAlignment="Center"/2930<!-- 状态管理 -->31                            <VisualStateManager.VisualStateGroups32                                <VisualStateGroup x:Name="CommonStates"33<!-- 正常状态 -->34                                    <VisualState x:Name="Normal"/3536<!-- 鼠标悬停:背景变亮 -->37                                    <VisualState x:Name="MouseOver"38                                        <Storyboard39                                            <ColorAnimation40                                            Storyboard.TargetName="border"41                                            Storyboard.TargetProperty="(Border.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)"42                                            To="#5BA3F5" Duration="0:0:0.15"/43                                        </Storyboard44                                    </VisualState4546<!-- 按下状态:轻微缩放 -->47                                    <VisualState x:Name="Pressed"48                                        <Storyboard49                                            <DoubleAnimation50                                            Storyboard.TargetName="border"51                                            Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleX)"52                                            To="0.97" Duration="0:0:0.05"/53                                            <DoubleAnimation54                                            Storyboard.TargetName="border"55                                            Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)"56                                            To="0.97" Duration="0:0:0.05"/57                                        </Storyboard58                                    </VisualState5960<!-- 禁用状态:降低透明度 -->61                                    <VisualState x:Name="Disabled"62                                        <Storyboard63                                            <DoubleAnimation64                                            Storyboard.TargetName="border"65                                            Storyboard.TargetProperty="Opacity"66                                            To="0.4" Duration="0"/67                                        </Storyboard68                                    </VisualState69                                </VisualStateGroup70                            </VisualStateManager.VisualStateGroups7172<!-- 为Pressed缩放准备RenderTransform -->73                            <Border.RenderTransform74                                <ScaleTransform ScaleX="1" ScaleY="1"75                                            CenterX="0.5" CenterY="0.5"/76                            </Border.RenderTransform77                            <Border.RenderTransformOrigin0.5,0.5</Border.RenderTransformOrigin78                        </Border79                    </ControlTemplate80                </Setter.Value81            </Setter82<!-- 默认属性 -->83            <Setter Property="Foreground" Value="White"/84            <Setter Property="FontSize" Value="14"/85            <Setter Property="Padding" Value="16,8"/86            <Setter Property="Cursor" Value="Hand"/87        </Style88    </Window.Resources89    <StackPanel Margin="20"90        <Button Style="{StaticResource RoundedButtonStyle}" Content="立即提交"/91    </StackPanel92</Window

踩坑预警:

ScaleTransformCenterX/CenterYRenderTransform中设置无效,必须通过RenderTransformOrigin在元素上设置。否则缩放效果会从左上角开始,看起来很奇怪。


方案二:中级进阶——带图标的自定义CheckBox

应用场景: 完全重绘CheckBox,使用自定义SVG路径替代系统默认的勾选框,适合设计感强的后台管理系统或工具类软件。

xml1<Window x:Class="AppWpfTemplate.Window1"2        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"3        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"4        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"5        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"6        xmlns:local="clr-namespace:AppWpfTemplate"7        mc:Ignorable="d"8        Title="Window1" Height="450" Width="800"910    <Window.Resources11        <Style x:Key="ModernCheckBoxStyle" TargetType="CheckBox"12        <Setter Property="Template"13            <Setter.Value14                <ControlTemplate TargetType="CheckBox"15                    <StackPanel Orientation="Horizontal"16                            VerticalAlignment="Center"1718<!-- 自定义勾选框区域 -->19                        <Border x:Name="checkBorder"20                            Width="20" Height="20"21                            CornerRadius="4"22                            BorderBrush="#CCCCCC"23                            BorderThickness="2"24                            Background="White"2526<!-- 勾选图标(使用Path绘制) -->27                            <Path x:Name="checkMark"28                              Data="M3,10 L8,15 L17,5"29                              Stroke="White"30                              StrokeThickness="2.5"31                              StrokeStartLineCap="Round"32                              StrokeEndLineCap="Round"33                              Visibility="Collapsed"34                              Stretch="Uniform"35                              Margin="3"/36                        </Border3738<!-- 标签文字 -->39                        <ContentPresenter Margin="8,0,0,0"40                                      VerticalAlignment="Center"/4142                        <VisualStateManager.VisualStateGroups43                            <VisualStateGroup x:Name="CommonStates"44                                <VisualState x:Name="Normal"/45                                <VisualState x:Name="MouseOver"46                                    <Storyboard47                                        <ColorAnimation48                                        Storyboard.TargetName="checkBorder"49                                        Storyboard.TargetProperty="BorderBrush.Color"50                                        To="#4A90E2" Duration="0:0:0.1"/51                                    </Storyboard52                                </VisualState53                            </VisualStateGroup5455                            <VisualStateGroup x:Name="CheckStates"56                                <VisualState x:Name="Unchecked"/57<!-- 选中状态:背景变蓝,显示勾号 -->58                                <VisualState x:Name="Checked"59                                    <Storyboard60                                        <ColorAnimation61                                        Storyboard.TargetName="checkBorder"62                                        Storyboard.TargetProperty="Background.Color"63                                        To="#4A90E2" Duration="0:0:0.15"/64                                        <ColorAnimation65                                        Storyboard.TargetName="checkBorder"66                                        Storyboard.TargetProperty="BorderBrush.Color"67                                        To="#4A90E2" Duration="0:0:0.15"/68                                        <ObjectAnimationUsingKeyFrames69                                        Storyboard.TargetName="checkMark"70                                        Storyboard.TargetProperty="Visibility"71                                            <DiscreteObjectKeyFrame KeyTime="0"72                                            Value="{x:Static Visibility.Visible}"/73                                        </ObjectAnimationUsingKeyFrames74                                    </Storyboard75                                </VisualState76                            </VisualStateGroup77                        </VisualStateManager.VisualStateGroups78                    </StackPanel79                </ControlTemplate80            </Setter.Value81        </Setter82        <Setter Property="Foreground" Value="#333333"/83        <Setter Property="FontSize" Value="14"/84        <Setter Property="Cursor" Value="Hand"/85        </Style86    </Window.Resources87    <StackPanel88<!-- 使用方式 -->89        <CheckBox Style="{StaticResource ModernCheckBoxStyle}"90          Content="记住我的选择"91          IsChecked="True"/92    </StackPanel93</Window

踩坑预警:

CheckBox有两个VisualStateGroup:CommonStates(Normal/MouseOver/Pressed/Disabled)和CheckStates(Checked/Unchecked/Indeterminate)。这两组必须同时声明,否则状态切换会出现异常——这是我在项目里踩过的真实坑,排查了半天才发现少了一个StateGroup。


方案三:高级实战——完全自定义的进度条控件

应用场景: 重写ProgressBar,实现带百分比文字、渐变填充、圆角效果的现代化进度条,常见于数据大屏或仪表盘类项目。

xml1<Style x:Key="ModernProgressBarStyle" TargetType="ProgressBar"2    <Setter Property="Template"3        <Setter.Value4            <ControlTemplate TargetType="ProgressBar"5                <Grid6<!-- 背景轨道 -->7                    <Border x:Name="PART_Track"8                            Background="#E8E8E8"9                            CornerRadius="10"10                            Height="{TemplateBinding Height}"/1112<!-- 进度填充区域(使用ClipToBounds裁剪圆角) -->13                    <Border CornerRadius="10"14                            ClipToBounds="True"15                            Height="{TemplateBinding Height}"16                        <Border x:Name="PART_Indicator"17                                HorizontalAlignment="Left"18                                CornerRadius="10"19                            <Border.Background20                                <LinearGradientBrush StartPoint="0,0" EndPoint="1,0"21                                    <GradientStop Color="#4A90E2" Offset="0"/22                                    <GradientStop Color="#7B61FF" Offset="1"/23                                </LinearGradientBrush24                            </Border.Background25                        </Border26                    </Border2728<!-- 百分比文字叠加 -->29                    <TextBlock HorizontalAlignment="Center"30                               VerticalAlignment="Center"31                               FontSize="12"32                               FontWeight="Bold"33                               Foreground="White"34                        <TextBlock.Text35                            <MultiBinding StringFormat="{}{0:0}%"36                                <Binding Path="Value"37                                         RelativeSource="{RelativeSource TemplatedParent}"/38                            </MultiBinding39                        </TextBlock.Text40                    </TextBlock41                </Grid42            </ControlTemplate43        </Setter.Value44    </Setter45    <Setter Property="Height" Value="24"/46</Style
csharp1// 在后台代码中绑定进度值(ViewModel示例)2public class DashboardViewModel : INotifyPropertyChanged3{4private double _progress;5public double Progress6    {7get => _progress;8set9        {10            _progress = value;11OnPropertyChanged(nameof(Progress));12        }13    }1415// 模拟异步任务进度更新16public async Task RunTaskAsync()17    {18for (int i = 0; i <= 100; i++)19        {20Progress = i;21await Task.Delay(50); // 模拟耗时操作22        }23    }2425public event PropertyChangedEventHandler PropertyChanged;26protected void OnPropertyChanged(string name) =>27PropertyChanged?.Invoke(thisnew PropertyChangedEventArgs(name));28}
xml1<!-- XAML绑定 -->2<ProgressBar Style="{StaticResource ModernProgressBarStyle}"3             Value="{Binding Progress}"4             Minimum="0" Maximum="100"5             Width="300"/
c1var viewModel = new DashboardViewModel();2this.DataContext = viewModel;3Loaded += async (s, e) => await viewModel.RunTaskAsync();

踩坑预警:

ProgressBar的PART_Indicator是一个命名约定(TemplatePart),WPF内部通过GetTemplateChild("PART_Indicator")来找到它并控制宽度。如果你把这个名字改了,进度条就不动了。凡是看到PART_前缀的命名,都是框架保留的关键节点,千万不要随意重命名


📊 三个方案横向对比

维度
方案一(圆角按钮)
方案二(自定义CheckBox)
方案三(进度条)
实现难度
⭐⭐
⭐⭐⭐
⭐⭐⭐⭐
适用场景
通用按钮定制
表单/设置类UI
数据展示类UI
VSM复杂度
单组状态
多组状态联动
无状态/简单
TemplatePart依赖
有(PART_Indicator)

💬 互动话题

话题一: 你在项目中有没有遇到过"Style改不了,必须上ControlTemplate"的场景?当时是怎么解决的?欢迎在评论区分享你的思路。

话题二: 对于复杂的UI定制,你更倾向于在XAML里手写ControlTemplate,还是用Blend可视化设计?两种方式各有什么体感上的差异?

🎯 实战小挑战: 尝试基于本文的方案一,为Button增加一个"加载中"状态——当IsEnabled=False且绑定了某个IsLoading属性时,按钮内部显示一个旋转的圆形动画。实现后欢迎截图分享!


🏁 总结与学习路径

三点核心收获:

  1. 1. ControlTemplate是WPF外观定制的终极手段,Style只能改属性值,Template才能重构视觉结构;
  2. 2. TemplateBinding + ContentPresenter + VisualStateManager 是模板开发的三件套,缺一不可;
  3. 3. PART_命名约定是框架与模板之间的隐式契约,必须严格遵守。

学习路线图:

如果你想继续深入WPF样式与模板体系,推荐按以下路径推进:

  • • 基础层:Style → Trigger → DataTrigger
  • • 进阶层:ControlTemplate → VisualStateManager → TemplatePart
  • • 高阶层:DataTemplate → ItemsPanelTemplate → 自定义控件(继承Control类)
  • • 工程化:将模板抽取到ResourceDictionary,按模块拆分,通过MergedDictionaries统一管理

控件模板这条路,入门容易精通难。但一旦真正掌握了它,你会发现WPF的UI定制能力几乎没有上限——任何设计稿,都只是时间问题。


💾 收藏理由: 本文包含3个可直接复用的ControlTemplate代码模板,涵盖Button、CheckBox、ProgressBar三种高频控件,下次遇到UI定制需求直接拿来改改就能用。

📢 觉得有收获的话,转发给你的WPF同行吧 —— 说不定能帮他们少踩几个坑,少熬几个夜。


🏷️ 标签:C#WPF控件模板XAMLUI开发性能优化设计模式

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-09 18:22:29 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/595975.html
  2. 运行时间 : 0.107729s [ 吞吐率:9.28req/s ] 内存消耗:4,856.93kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=810fb24896cae878ad945ac535d4ad4a
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000528s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000962s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000348s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000274s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000723s ]
  6. SELECT * FROM `set` [ RunTime:0.000298s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000615s ]
  8. SELECT * FROM `article` WHERE `id` = 595975 LIMIT 1 [ RunTime:0.000508s ]
  9. UPDATE `article` SET `lasttime` = 1778322149 WHERE `id` = 595975 [ RunTime:0.011896s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000385s ]
  11. SELECT * FROM `article` WHERE `id` < 595975 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000574s ]
  12. SELECT * FROM `article` WHERE `id` > 595975 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000436s ]
  13. SELECT * FROM `article` WHERE `id` < 595975 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000942s ]
  14. SELECT * FROM `article` WHERE `id` < 595975 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000835s ]
  15. SELECT * FROM `article` WHERE `id` < 595975 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001133s ]
0.110486s