c#软件开发学习笔记--WPF(控件、变换、触发器、控件模板)

.NET/C#汇总 —— WPF WPF英⽂全称是Windows Presentation Foundation,中⽂为Windows表现层基础。是微软最初 在.NET Framework3.5平台推出的⼀个图形平台。1 XAML是eXtensible Application Markup Language的英⽂缩写,相应于中⽂称为可扩展应⽤程序标 记语⾔,它是微软公司为构建应⽤程序⽤户界⾯⽽创建的⼀种新的描述性语⾔。2 XAML是XML语⾔的⼀个衍⽣物,它的语法与XML语⾔完全⼀致,它的功能就是专⻔⽤来设计和实现 程序的UI。 阅读详情

WPF 学习总结


一、文本控件

RichTextBox 富文本控件

RichTextBox 用于显示和编辑富文本,内部使用 FlowDocument 排版内容。

<RichTextBox Width="200" HorizontalAlignment="Left">
    <FlowDocument>
        <!-- Paragraph:段落,LineHeight 行高,TextIndent 首行缩进 -->
        <Paragraph LineHeight="20" TextIndent="20">
            <!-- Run:显示纯文本 -->
            <Run Text="防弹咖啡东方今典辅导费..."></Run>
        </Paragraph>
        <Paragraph>
            <Run Foreground="Red" Text="红色文本"></Run>
        </Paragraph>
        <Paragraph>
            <Run Foreground="Blue" Text="蓝色文本"></Run>
        </Paragraph>
    </FlowDocument>
</RichTextBox>

关键点:

  • FlowDocument:流式容器,用于排版富文本,支持图文混排,类似于 Word 文档的流式布局
  • Paragraph:段落,可设置 LineHeight(行高)、TextIndent(首行缩进)
  • Run:显示纯文本,可设置 Foreground 等属性改变文本颜色

二、控件基础属性

Visibility 可见性

用于控制控件是否可见,有三个取值:

值说明
Visible默认值,控件可见
Hidden隐藏控件,但仍然占据布局空间
Collapsed折叠控件,不占据布局空间
<Button Content="内容1" Visibility="Visible" />

Panel.ZIndex 层级关系

Panel.ZIndex 用于控制控件在 Z 轴(垂直屏幕方向)上的层级关系,Z 值越大,控件越靠上。

<Button Panel.ZIndex="2" Content="按钮2" Width="200" Height="200" HorizontalAlignment="Left" />
<StackPanel Panel.ZIndex="1" Background="Red">
    <Button Content="内容1" />
</StackPanel>

三、变换(Transform)

RenderTransform 用于对控件进行渲染变换,WPF 提供四种基本变换类型:

变换类型类名说明
平移变换TranslateTransform移动控件位置,X 水平偏移,Y 垂直偏移
旋转变换RotateTransform旋转控件,Angle 旋转角度,CenterX/CenterY 变换中心
缩放变换ScaleTransform缩放控件,ScaleX 水平缩放,ScaleY 垂直缩放
倾斜变换SkewTransform倾斜控件,AngleX 水平倾斜,AngleY 垂直倾斜

示例:平移变换

<Rectangle Width="100" Height="30" Fill="Red">
    <Rectangle.RenderTransform>
        <TranslateTransform X="200" Y="10" />
    </Rectangle.RenderTransform>
</Rectangle>

示例:旋转变换

<Rectangle Width="100" Height="30" Fill="Red">
    <Rectangle.RenderTransform>
        <RotateTransform Angle="45" CenterX="50" CenterY="15" />
    </Rectangle.RenderTransform>
</Rectangle>

示例:缩放变换

<Rectangle Width="100" Height="30" Fill="Red">
    <Rectangle.RenderTransform>
        <ScaleTransform ScaleX="2" ScaleY="0.5" />
    </Rectangle.RenderTransform>
</Rectangle>

示例:倾斜变换

<Rectangle Width="100" Height="30" Fill="Red">
    <Rectangle.RenderTransform>
        <SkewTransform AngleX="0" AngleY="30" />
    </Rectangle.RenderTransform>
</Rectangle>

组合变换: 使用 TransformGroup 组合多个变换效果

<Rectangle.RenderTransform>
    <TransformGroup>
        <ScaleTransform ScaleX="1.5" ScaleY="1.5" CenterX="50" CenterY="50" />
        <RotateTransform Angle="30" CenterX="50" CenterY="50" />
    </TransformGroup>
</Rectangle.RenderTransform>

四、样式(Style)

Style 用于定义控件的一组属性值,实现外观的统一管理。

基本语法

<Style x:Key="BorderStyle" TargetType="{x:Type Border}">
    <!-- 使用 Setter 设置属性值 -->
    <Setter Property="Background" Value="Green" />
    <Setter Property="BorderBrush" Value="Red" />
</Style>

关键点:

  • x:Key:样式的唯一标识,用于引用
  • TargetType:指定该样式应用于哪种控件类型
  • Setter:设置属性值,包含 Property(属性名)和 Value(属性值)

使用样式

通过 StaticResource 或 DynamicResource 引用样式:

<Border Style="{StaticResource BorderStyle}" Height="100" Width="100" BorderThickness="4" />
引用方式说明
StaticResource静态引用,在加载时解析,资源变化后不会更新
DynamicResource动态引用,在运行时解析,资源变化后会自动更新

五、触发器(Trigger)

触发器是 WPF 实现交互式样式的核心机制,允许在特定条件满足时自动改变控件的属性值。触发器定义在 Style.Triggers 或 ControlTemplate.Triggers 集合中。

1. Trigger 属性触发器

属性触发器:当控件的某个属性等于指定值时触发。

示例:Border 鼠标悬停改变背景和边框

<Style x:Key="BorderStyle" TargetType="{x:Type Border}">
    <Style.Triggers>
        <!-- 鼠标移入:背景变绿,边框变红 -->
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="Green" />
            <Setter Property="BorderBrush" Value="Red" />
        </Trigger>
        <!-- 鼠标移出:背景变白,边框变灰 -->
        <Trigger Property="IsMouseOver" Value="False">
            <Setter Property="Background" Value="White" />
            <Setter Property="BorderBrush" Value="Gray" />
        </Trigger>
    </Style.Triggers>
</Style>

示例:鼠标悬停时触发变换效果

<Style x:Key="BorderStyle1" TargetType="{x:Type Border}">
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="RenderTransform">
                <Setter.Value>
                    <TransformGroup>
                        <ScaleTransform ScaleX="1.5" ScaleY="1.5" CenterX="50" CenterY="50" />
                        <RotateTransform Angle="30" CenterX="50" CenterY="50" />
                    </TransformGroup>
                </Setter.Value>
            </Setter>
        </Trigger>
        <Trigger Property="IsMouseOver" Value="False">
            <Setter Property="RenderTransform">
                <Setter.Value>
                    <TransformGroup>
                        <ScaleTransform ScaleX="1" ScaleY="1" CenterX="50" CenterY="50" />
                        <RotateTransform Angle="0" />
                    </TransformGroup>
                </Setter.Value>
            </Setter>
        </Trigger>
    </Style.Triggers>
</Style>

2. MultiTrigger 多条件触发器

多条件触发器:当多个条件同时满足时才触发样式变化。

<Style x:Key="TextBoxStyle" TargetType="TextBox">
    <Setter Property="Foreground" Value="Black" />
    <Style.Triggers>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <!-- 条件1:鼠标悬停 -->
                <Condition Property="IsMouseOver" Value="True" />
                <!-- 条件2:获取焦点 -->
                <Condition Property="IsFocused" Value="True" />
            </MultiTrigger.Conditions>
            <MultiTrigger.Setters>
                <Setter Property="Background" Value="Red" />
            </MultiTrigger.Setters>
        </MultiTrigger>
    </Style.Triggers>
</Style>

关键点:

  • <MultiTrigger.Conditions> 中定义多个条件
  • <MultiTrigger.Setters> 中定义所有条件满足时执行的属性设置
  • 所有条件必须同时满足才会触发

3. EventTrigger 事件触发器

事件触发器:当某个路由事件(如 MouseEnter、MouseLeave)发生时触发,通常配合 Storyboard(动画板) 实现动画效果。

<Style x:Key="ButtonStyle" TargetType="Button">
    <Style.Triggers>
        <!-- 鼠标进入事件 -->
        <EventTrigger RoutedEvent="MouseEnter">
            <EventTrigger.Actions>
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetProperty="Width"
                                         From="100" To="300"
                                         Duration="0:0:0.5" />
                        <ColorAnimation Storyboard.TargetProperty="Foreground.Color"
                                        From="Yellow" To="Black"
                                        Duration="0:0:1.0" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger.Actions>
        </EventTrigger>
        <!-- 鼠标离开事件 -->
        <EventTrigger RoutedEvent="MouseLeave">
            <EventTrigger.Actions>
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetProperty="Width"
                                         From="300" To="100"
                                         Duration="0:0:0.5" />
                        <ColorAnimation Storyboard.TargetProperty="Foreground.Color"
                                        From="Black" To="Yellow"
                                        Duration="0:0:0.5" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger.Actions>
        </EventTrigger>
    </Style.Triggers>
</Style>

三种触发器对比:

类型触发条件典型应用
Trigger单个属性等于特定值鼠标悬停改变颜色
MultiTrigger多个属性同时满足条件鼠标悬停且获取焦点时改变背景
EventTrigger路由事件发生鼠标进入/离开时运行动画

六、动画(Animation)

动画通过 Storyboard(动画板) 实现,配合 EventTrigger 使用。

动画类型

动画类作用对象类型典型属性
DoubleAnimationdouble 类型属性Width、Height、Opacity、RenderTransform 等
ColorAnimation颜色类型属性Foreground、Background、BorderBrush 等

动画参数

参数说明
Storyboard.TargetProperty指定要执行动画的属性名称
From动画起始值
To动画结束值
Duration动画持续时间,格式为 时:分:秒(如 0:0:0.5 表示 500 毫秒)

动画结构

<EventTrigger RoutedEvent="MouseEnter">
    <EventTrigger.Actions>
        <BeginStoryboard>
            <Storyboard>
                <!-- 宽度从 100 到 300,持续 500ms -->
                <DoubleAnimation Storyboard.TargetProperty="Width"
                                 From="100" To="300"
                                 Duration="0:0:0.5" />
                <!-- 前景色从黄色到黑色,持续 1s -->
                <ColorAnimation Storyboard.TargetProperty="Foreground.Color"
                                From="Yellow" To="Black"
                                Duration="0:0:1.0" />
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger.Actions>
</EventTrigger>

七、控件模板(ControlTemplate)

1. 基本用法

ControlTemplate 用于定义控件的外观结构和视觉行为,决定控件"长什么样"以及"如何响应用户交互"。与 Style 不同,Style 只能修改控件的现有属性,而 ControlTemplate 可以完全重写控件的可视化树。

<ControlTemplate x:Key="ButtonTemplate1" TargetType="Button">
    <!-- 使用 Border 作为容器 -->
    <Border x:Name="border" Background="Red"
            BorderBrush="{TemplateBinding BorderBrush}"
            BorderThickness="{TemplateBinding BorderThickness}">
        <StackPanel>
            <CheckBox />
            <CheckBox />
            <!-- 内容呈现器:渲染控件外部设置的内容 -->
            <ContentPresenter />
        </StackPanel>
    </Border>
    <!-- 模板中的触发器 -->
    <ControlTemplate.Triggers>
        <Trigger Property="IsMouseOver" Value="true">
            <Setter Property="Background" TargetName="border" Value="Yellow" />
            <Setter Property="BorderBrush" TargetName="border" Value="Blue" />
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

2. TemplateBinding 模板绑定

TemplateBinding 是控件模板中的标记扩展,用于将模板内部元素的属性绑定到使用该模板的控件的对应属性上,使用户在外部设置控件属性时能自动传递到模板内部元素。

<Border Background="{TemplateBinding Background}"
        BorderBrush="{TemplateBinding BorderBrush}"
        BorderThickness="{TemplateBinding BorderThickness}" />

3. ContentPresenter 内容呈现器

ContentPresenter 是控件模板中的内容占位符,负责渲染控件的内容(如 Button 的文本、图片等)。

<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                  Margin="{TemplateBinding Padding}"
                  RecognizesAccessKey="True"
                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />

属性说明:

  • Focusable="False":不让内容区获取焦点,由外部控件统一管理
  • RecognizesAccessKey="True":支持快捷键(如 Alt+字母)
  • Margin="{TemplateBinding Padding}":绑定外层内边距作为内容外边距

4. 模板中的触发器

在 ControlTemplate.Triggers 中可以使用触发器,通过 TargetName 指定模板内部元素的名称。

<ControlTemplate.Triggers>
    <Trigger Property="IsMouseOver" Value="true">
        <Setter Property="Background" TargetName="border" Value="Yellow" />
        <Setter Property="BorderBrush" TargetName="border" Value="Blue" />
    </Trigger>
    <Trigger Property="IsPressed" Value="true">
        <Setter Property="Background" TargetName="border" Value="Red" />
        <Setter Property="BorderBrush" TargetName="border" Value="Blue" />
    </Trigger>
    <Trigger Property="IsEnabled" Value="false">
        <Setter Property="Background" TargetName="border" Value="Yellow" />
        <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="Gray" />
    </Trigger>
</ControlTemplate.Triggers>

八、依赖属性(DependencyProperty)

概念

依赖属性 是 WPF 专门设计的属性系统,值存储在内部字典中,而非私有字段。依赖属性支持绑定、样式、动画、触发器等 WPF 核心功能。

普通属性与依赖属性的区别

特性普通属性依赖属性
值存储私有字段内部字典
支持绑定不支持支持
支持动画不支持支持
支持样式不支持支持
支持触发器不支持支持

依赖属性的组成

  1. CLR 包装器:标准的 .NET 属性封装,通过 GetValue/SetValue 读写值
  2. 静态属性注册器:通过 DependencyProperty.Register 注册,将属性注册到 WPF 属性系统中

语法结构

// 1. CLR 包装器
public CornerRadius CornerRadius
{
    get { return (CornerRadius)GetValue(CornerRadiusProperty); }
    set { SetValue(CornerRadiusProperty, value); }
}

// 2. 静态属性注册器
public static readonly DependencyProperty CornerRadiusProperty =
    DependencyProperty.Register("CornerRadius", typeof(CornerRadius), typeof(MyButton));

Register 方法参数说明:

  • 参数1:属性名称(字符串),必须与 CLR 包装器名称一致
  • 参数2:属性类型
  • 参数3:所属类的类型
  • 参数4(可选):PropertyMetadata 设置默认值

带默认值的依赖属性

public string BaXian
{
    get { return (string)GetValue(BaXianProperty); }
    set { SetValue(BaXianProperty, value); }
}
public static readonly DependencyProperty BaXianProperty =
    DependencyProperty.Register("BaXian", typeof(string), typeof(MyButton),
        new PropertyMetadata("八仙")); // 设置默认值为 "八仙"

Visual Studio 快捷键: 输入 prodp 然后按 Tab 键,可快速生成依赖属性代码片段。


九、自定义控件

通过继承现有控件(如 Button)并添加依赖属性,可以创建自定义控件。

public class MyButton : Button
{
    private int age;  // 普通属性
    public int Age { get; set; }

    // 依赖属性:CornerRadius
    public CornerRadius CornerRadius
    {
        get { return (CornerRadius)GetValue(CornerRadiusProperty); }
        set { SetValue(CornerRadiusProperty, value); }
    }
    public static readonly DependencyProperty CornerRadiusProperty =
        DependencyProperty.Register("CornerRadius", typeof(CornerRadius), typeof(MyButton));

    // 依赖属性:BaXian(带默认值)
    public string BaXian
    {
        get { return (string)GetValue(BaXianProperty); }
        set { SetValue(BaXianProperty, value); }
    }
    public static readonly DependencyProperty BaXianProperty =
        DependencyProperty.Register("BaXian", typeof(string), typeof(MyButton),
            new PropertyMetadata("八仙"));
}

在 XAML 中使用自定义控件:

<!-- 引入命名空间 -->
<Window xmlns:c="clr-namespace:项目名.Controls">

    <!-- 使用自定义控件 -->
    <c:MyButton Template="{DynamicResource ButtonTemplate2}"
                CornerRadius="200"
                BaXian="钟离权" />
</Window>

在模板中绑定自定义控件的依赖属性:

<ControlTemplate x:Key="ButtonTemplate2" TargetType="{x:Type c:MyButton}">
    <Border CornerRadius="{TemplateBinding CornerRadius}">
        <StackPanel>
            <CheckBox />
            <CheckBox />
            <TextBlock Text="{TemplateBinding BaXian}" />
            <ContentPresenter />
        </StackPanel>
    </Border>
</ControlTemplate>

十、资源字典(ResourceDictionary)

ResourceDictionary 用于集中管理 WPF 资源(样式、模板、画刷等),支持跨文件合并。

合并资源字典

在 App.xaml 中合并多个资源字典文件:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Dictionary1.xaml" />
            <ResourceDictionary Source="/Dictionary2.xaml" />
            <ResourceDictionary Source="/Dictionary3.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

定义资源字典文件

<!-- Dictionary1.xaml -->
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <!-- 定义颜色资源 -->
    <SolidColorBrush x:Key="Button.Static.Background" Color="#FFDDDDDD" />
    <SolidColorBrush x:Key="Button.Static.Border" Color="#FF707070" />

    <!-- 定义样式 -->
    <Style x:Key="ButtonStyle1" TargetType="{x:Type Button}">
        <!-- ... -->
    </Style>

    <!-- 定义控件模板 -->
    <ControlTemplate x:Key="ButtonTemplate1" TargetType="Button">
        <!-- ... -->
    </ControlTemplate>
</ResourceDictionary>

引用资源

引用方式说明
StaticResource静态引用,在 XAML 加载时解析,资源变化后不会更新
DynamicResource动态引用,在运行时解析,资源变化后会自动更新
<Button Style="{StaticResource ButtonStyle1}" />
<Button Template="{DynamicResource ButtonTemplate1}" />

十一、总结与对比

核心概念对比

概念作用使用场景
Style(样式)定义控件的一组属性值统一设置控件的字体、颜色、大小等
Trigger(触发器)条件满足时自动改变属性鼠标悬停、获取焦点等交互效果
ControlTemplate(控件模板)完全重写控件的外观结构自定义按钮、输入框等控件的视觉样式
DependencyProperty(依赖属性)支持绑定/动画/样式的属性系统为自定义控件添加可交互的属性
ResourceDictionary(资源字典)集中管理样式、模板等资源跨页面共享资源,模块化管理

四种变换类型

变换类名关键属性
平移TranslateTransformX, Y
旋转RotateTransformAngle, CenterX, CenterY
缩放ScaleTransformScaleX, ScaleY, CenterX, CenterY
倾斜SkewTransformAngleX, AngleY

三种触发器类型

类型触发条件典型应用
Trigger单个属性等于特定值鼠标悬停改变颜色
MultiTrigger多个属性同时满足条件鼠标悬停且获取焦点时改变背景
EventTrigger路由事件发生鼠标进入/离开时运行动画

两种动画类型

动画类作用属性示例
DoubleAnimationdouble 类型属性Width、Height、Opacity
ColorAnimation颜色类型属性Foreground、Background

WPF在工业系统集成中的核心价值与应用实践 WPF(Windows Presentation Foundation)作为微软推出的UI框架,在工业系统集成中展现出独特优势。其数据绑定机制和XAML标记语言使界面与逻辑分离,大幅提升开发效率,特别适合工业场景的实时数据展示需求。结合DirectX渲染引擎,WPF能够高性能呈现复杂工艺流程图,满足智能制造中对AGV调度、工业组态开发等核心模块的需求。在ERP与MES系统集成中,WPF通过统一技术栈打通数据链路,显著提升订单交付周期和车间物料周转效率。本文通过实战案例,解析WPF在工业系统集成中的关键技术点 阅读详情

相关推荐

Silverlight底层原理:DependencyObject与XAML编译机制解析

UI框架中的依赖属性(DependencyProperty)是实现数据绑定、样式继承与动画控制的核心基础设施;XAML并非简单标记语言,而是编译期对象图序列化协议。其背后基于DependencyObject的三层哈希属性存储模型、TemplateBinding的轻量绑定机制、以及StaticResource/DynamicResource的作用域治理逻辑,构成了现代.NET UI框架(如WPF、Avalonia、.NET MAUI)的底层范式。理解这些原理,能显著提升对DataTemplate、Visual

547

C# WPF 基础教程——触发器、行为、形状、变换与透明、路径和几何图形、控件模板、数据模板、listbox的模板

触发器 简单触发器 单条件触发器 多条件触发器 事件触发器 行为

qq_42832272的博客 904

WPF特效控件集合详解与实战应用

WPF(Windows Presentation Foundation)作为微软推出的现代UI开发框架,以其强大的图形渲染能力和灵活的样式控制机制,广泛应用于桌面应用程序开发中。特效控件是WPF中实现视觉吸引力的重要手段,它通过动画(Animation)、变换(Transform)、视觉效果(Effect)等核心技术,实现界面元素的动态化、交互性和美观性。本章将引导读者了解WPF特效控件的基本构成,包括其与UI架构的关系、核心功能模块的划分,以及其在现代应用开发中的重要地位。

weixin_42168902的博客 813

wpf 音频波形图_wpf波形图 - IT屋-程序员软件开发技术分享社区

我正在使用.net WPF几何图形类来绘制波形图。我一直在使用矩阵变换将屏幕坐标空间转换为波形的坐标空间。一切都很好,而且跟踪窗口和缩放比例等非常简单。我什至可以使用逆变换来根据坐标空间计算鼠标位置。我使用内置的Scaling和Translation类,然后使用自定义矩阵进行y轴翻转(没有用于翻转的预制矩阵)。我也希望能够以对数刻度(x轴或y轴或两者)绘制这些波形,但是我不确定是否可以通过矩阵变换...

weixin_39547158的博客 1923

WPF动画悬浮球菜单实战项目演示

WPF(Windows Presentation Foundation)凭借其强大的图形能力与灵活的数据驱动机制,为构建现代化、高交互性的用户界面提供了坚实基础。悬浮球菜单作为一种轻量级、非侵入式的快捷操作入口,在屏幕空间有限的场景下尤为重要。本章聚焦于悬浮球菜单的核心功能设计:支持动态显示/隐藏、响应鼠标拖拽与边界吸附、实现多层级子菜单展开,并通过透明度与位移动画提升交互流畅感。在现代WPF应用程序开发中,UI的可维护性、可复用性和视觉一致性是衡量架构质量的重要指标。

weixin_42502089的博客 694

基于C#的2048小游戏开发实战项目

场景推荐做法内部循环遍历使用 for 循环确保索引合法,跳过验证以提高性能外部调用(UI/插件)强制验证并抛出异常单元测试注入边界值(-1, 4, 5)测试防护机制通过分层控制,既能保证安全性,又能兼顾运行效率。

weixin_42599908的博客 1088

WPF自定义开关控件实战:从ToggleButton到Switcher的华丽变身(附完整源码)

本文详细介绍了如何将WPF基础ToggleButton控件升级为功能强大、视觉效果出众的自定义Switcher开关控件。通过实战演示了控件模板、依赖属性、动画和值转换器等WPF核心技术的综合运用,提供了完整的源码实现,帮助开发者掌握自定义控件开发流程,提升应用界面的专业感和用户体验。

stone的博客 387

微软官方WPF案例仓库实战:从绑定制模板到性能优化的完整指南

桌面应用开发中,UI框架的选择直接决定产品体验与维护成本。WPF作为微软推出的矢量渲染UI框架,凭借灵活的数据绑定与模板化机制,成为Windows桌面端复杂业务系统的首选技术之一。其核心原理在于将界面视觉与业务逻辑解耦,通过依赖属性、数据绑定及MVVM模式实现数据驱动UI,从而提升代码可复用性与可测试性。在实际工程中,合理运用ControlTemplate与DataTemplate能够打造出高度定制化的现代界面,同时结合触发器与动画优化交互细节。该技术栈在工业控制、企业管理软件、医疗系统等领域应用广泛。而微

weixin_32247165的博客 144

WPF 2024 金九银十 最新 高级 架构 面试题 C#

WPF)是一种用于创建Windows桌面应用程序的UI框架。它提供了丰富的图形、动画、多媒体和文本处理等功能,使开发人员可以创建出现代化、高效的用户界面。WPF使用XAML)作为界面定义语言,允许开发人员通过声明性标记来创建用户界面,而无需编写大量的代码。WPF还引入了数据绑定、命令、样式和模板等概念,使得代码的组织和重用更加容易。WPF采用了基于矢量图形的渲染引擎,可以以高质量的方式呈现各种UI元素,包括文字、图像、几何形状等。同时,WPF还支持3D。

cao919的专栏Net 2230

ESXI 8.0虚拟机安装OpenWRT软路由详细教程

OpenWrt 是嵌入式的 Linux 路由器固件,OpenWrt在稳定运行的同时提供了强大的扩展能力,用户可以完全的定制属于自己的路由系统,满足不一样的个性化需求,本文讲解如何使用ESXI安装OpenWRT,打造属于自己的软路由。本次安装使用的是版本。默认登录信息:用户:root密码:password下载固件:https://github.com/haiibo/OpenWrt/releases/tag/X86_64【CPU配置】:4核心。

qq_27121281的博客 3915

将ue4程序嵌入qt界面显示

需求:将ue4程序嵌入qt界面显示 思路:通过使用 windowsAPI 对ue4窗口进行设置跟随qt界面以及活动窗口时的位置层序设置

weixin_44342705的博客 5845

.NET CORE(C#) WPF 值得推荐的动画菜单设计

微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏。.NET CORE(C#) WPF 值得推荐的动画菜单设计阅读导航本文背景代码实现...

dotNET跨平台 643

AI 算力基础设施深度系列(一):从容器到 Kubernetes——算力底座的诞生

1. 容器 = Namespace(视图隔离) + Cgroup(资源限制) + Union FS(镜像分层)└── 不是虚拟机!共享内核,接近零开销2. K8S 三大设计哲学:└── 声明式 API + 控制循环 + 可扩展架构3. K8S 架构:└── 控制面 (API Server / etcd / Scheduler / Controller Manager)

warm3snow的博客 534

一本计划中的WPF图书目录

第1章 Windows Vista1.1 Windows Vista简介1.1.1 Windows Vista Aero体验1.1.2 Windows Vista的网络管理1.1.3 Windows Vista的安全性1.2 .Net Framework 3.0简介1.2.1 WCF简介1.2.2 WF简介1.2.3 CardSpace简介1.2.4 WPF 简介1.3 .Net Framew

软件开发资料汇总 383

记一次完整的RPG Maker MV游戏逆向过程(思路一)

了解RPG Maker MV的文件建构 上一篇文章,我们已经成功在PC上运行了游戏,那我们如何对游戏进行逆向呢? 首先要了解正常的RPG Maker MV制作的游戏应该具有哪些文件,以及他的结构 那如何了解他的结构呢,很简单,我们只需要用RPG Maker MV创建一个默认工程,来看看一个游戏的最简结构是怎么样的 创建新项目 项目创建完成 查看项目目录结构 是不是和之前解包出来的很像呢? 通...

Ciiiiiing的博客 1万+

3D结构光 vs TOF——手机厂商为何选择TOF方案?

3D视觉感知技术路线分析:结构光与TOF对比 3D视觉感知领域存在结构光和TOF两大主流技术。结构光基于三角定位法,精度高(毫米级)但工作距离短(<1.5米),适合人脸识别等近距离场景;TOF通过测量光脉冲飞行时间计算深度,精度中等(厘米级)但工作距离长(0.5-5米+),更适合AR导航等中远距离应用。手机厂商选型时考虑:前置认证选择结构光(如苹果FaceID),后置场景倾向TOF(安卓阵营),因后者更适配全面屏设计、环境适应性强且成本优势明显。两种技术互补共存,共同推动3D感知应用发展。

致力于lidar应用开发 113

关于WPF你应该知道的2000件事

关于WPF你应该知道的2000件事 原文 关于WPF你应该知道的2000件事 以下列出了迄今为止为WPF博客所知的2,000件事所创建的所有帖子。 帖子总数= 1,201 动画 #7 - 基于属性的动画 #686 - 使用动画制作图像脉冲 #777 - 动画变换 #778 - 动画缩放变换 #779 - 动画...

weixin_30518397的博客 716

AI智能体丨使用Coze一键生成爆款书单视频,3个月内获赞131.1w!(附保姆级教程)

这篇教程详细介绍了如何使用扣子(Coze)平台的AI智能工作流批量制作爆款书单视频。通过自动化流程,只需1-2分钟即可生成45-50秒的书单视频,效率提升近百倍。工作流包含文案生成、音频合成、图片素材获取、视频剪辑等全流程,支持随机生成8本书单、自动提取金句、智能配音等功能。教程提供了完整的操作步骤,包括剪映草稿配置、特效添加等细节,并附体验链接和示例效果。最终生成的视频包含书单展示、金句字幕、背景音乐等元素,适合书单号运营者快速批量产出内容。

李同学Lino的博客 2354

从WinForms的“拖拽式快速开发”到WPF的“数据驱动现代化UI”的技术迭代,从底层架构、性能实测、场景适配三大维度深度对比,再通过真实项目案例拆解选型逻辑

2026年没有“绝对优胜者”,而是“场景适配”。WinForms已通过DirectX“重生”,适合80%中小项目;WPF在复杂HMI上仍是王道,尤其.NET 10的性能+Fluent主题让它更现代化。如果你正纠结具体项目选型,或想看.NET 10下WPF/WinForms的最新代码示例(Fluent主题启用、DirectX配置),或者分享你的踩坑经历,欢迎留言!

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 730

2023华为od机试C卷【启动多任务排序】C++ 实现

一个应用启动时,会有多个初始化任务需要执行,并且任务之间有依赖关系,例如A任务依赖B任务,那么必须在B任务执行完成之后,才能开始执行A任务。现在给出多条任务依赖关系的规则,请输入任务的顺序执行序列,规则采用贪婪策略,即一个任务如果没有依赖的任务,则立刻开始执行,如果同时有多个任务要执行,则根据任务名称字母顺序排序。

MISAYAONE的博客 887

深度学习实战42-基于大模型开发MathGPT的原理介绍,让数学问题智能解答变为可能

大家好,我是微学AI,今天给大家介绍一下深度学习实战42-基于大模型开发MathGPT的原理介绍,让数学问题智能解答变为可能。在去年ChatGPT的发布后,各种国内外的大语言模型层出不穷涌现,但是大家都知道现在的模型的诟病的数学能力不足,就算是简单的数学题都可能算错,今天我就来给大家引入MathGPT的模型,用来解决GPT解决数学问题,对于简单的初中数学高中数学都可以解决,让数学问题精准答题得到实现。

微学AI的博客 1651

格式化绑定的数据

原文:格式化绑定的数据 1、数据转换。 WPF中,数据绑定有两种方式:字符串格式化和值转换器。 1.1)、字符串格式化。 用StringFormat属性属性。 语法:StringFormat = "{}{0:格式字符串}"其中第一个花括号{}是标识转义序列。 <TextBox FontSize="20" Grid.Row="2" Grid.Colu...

weixin_34293141的博客 250

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C# LINQ中Where与Select的工程化实践指南

LINQ中的Where和Select是.NET数据处理的核心操作符,本质是延迟执行的函数式数据流组件:Where实现条件过滤与节流控制,Select完成投影变换与结构重构。其原理根植于IEnumerable接口、委托链与yield return机制,技术价值在于解耦数据获取、过滤与转换逻辑,支撑高频采集、实时UI刷新、PLC上位机通信等典型工业场景。在西门子1200 PLC数据采集、NModbus4寄存器解析及WPF绑定中,合理运用Where条件短路、Select惰性求值与闭包规避,可显著降低GC压力、避免

weixin_34320159的博客 248

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

MCP Inspection:.NET桌面应用实时UI调试与可观测性解决方案

在桌面应用开发中,UI调试与数据绑定诊断是提升开发效率的关键环节。传统调试器依赖断点与日志输出,难以应对运行时动态界面问题,尤其在复杂可视化树与MVVM架构下效率低下。MCP(Model Context Protocol)作为一种开放协议,通过标准化通信模型,实现了工具与数据源间的解耦交互。其技术价值在于将UI检查能力服务化,支持非侵入式运行时诊断,填补了生产环境可观测性空白。通过集成MCP Server,Avalonia、WPF等应用可暴露UI树、控件属性等资源,供任何兼容客户端实时消费,极大优化了调试工

weixin_30267785的博客 686

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Microsoft Expression 3 新功能简介

Microsoft Expression 3 新功能简介 Posted 周二, 07/14/2009 - 23:36 by East 2009年7月10日,微软公司在旧金山宣布推出Microsoft Expression3,这是一套面向强大平台的高级工具组,用于在Web上创建并交付富互联网应用程序(RIA)和媒体体验。在设计与开发者的工作中,

天行健 677

第6章第4节:自定义分词器

本节详解Elasticsearch自定义分词器,解析analyzer三段式结构(char_filter→tokenizer→filter),掌握常用组件如ik_max_word、synonym_graph、ngram等。通过_analyze API调试分词效果,实现“索引时扩展同义词、搜索时不带”的生产级方案,提升中文搜索与智能提示体验。

啊渊的专栏 769
上一篇: c#软件开发学习笔记--WPF(控件、样式)
下一篇: c#软件开发学习笔记--WPF(Canvas、数据绑定、MVVM模式、值转换器)
Z599817841
博客等级 码龄4年 12粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值