WPF 核心概念笔记(补充示例)

一、样式分类与使用示例

  1. 按范围分类示例

    复制代码
    <!-- 1. 全局样式(App.xaml中) -->
    <Application.Resources>
        <Style x:Key="GlobalButtonStyle" TargetType="Button">
            <Setter Property="Background" Value="LightBlue"/>
            <Setter Property="FontSize" Value="14"/>
        </Style>
    </Application.Resources>
    ​
    <!-- 2. 局部样式(Window.xaml中) -->
    <Window.Resources>
        <Style x:Key="LocalTextBoxStyle" TargetType="TextBox">
            <Setter Property="Foreground" Value="DarkGreen"/>
            <Setter Property="Margin" Value="5"/>
        </Style>
    </Window.Resources>
    ​
    <!-- 3. 行内样式 -->
    <Button Style="{StaticResource GlobalButtonStyle}">
        <Button.Style>
            <!-- 行内样式会覆盖外部样式 -->
            <Style TargetType="Button">
                <Setter Property="Width" Value="100"/>
            </Style>
        </Button.Style>
    </Button>
  2. 静态与动态资源使用区别

    复制代码
    <!-- 静态资源 -->
    <TextBox Style="{StaticResource LocalTextBoxStyle}"/>
    ​
    <!-- 动态资源 -->
    <TextBox Style="{DynamicResource ThemeTextBoxStyle}"/>
二、触发器示例
  1. Trigger(普通触发器)

    复制代码
    <Style TargetType="Button">
        <Setter Property="Background" Value="Gray"/>
        <Style.Triggers>
            <!-- 鼠标悬停时改变背景 -->
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="Blue"/>
                <Setter Property="Cursor" Value="Hand"/>
            </Trigger>
        </Style.Triggers>
    </Style>
  2. MultiTrigger(多条件触发器)

    复制代码
    <Style TargetType="TextBox">
        <Style.Triggers>
            <!-- 同时满足两个条件 -->
            <MultiTrigger>
                <MultiTrigger.Conditions>
                    <Condition Property="IsFocused" Value="True"/>
                    <Condition Property="Text" Value=""/>
                </MultiTrigger.Conditions>
                <Setter Property="BorderBrush" Value="Red"/>
                <Setter Property="ToolTip" Value="不能为空"/>
            </MultiTrigger>
        </Style.Triggers>
    </Style>
  3. EventTrigger(事件触发器)

    复制代码
    <Style TargetType="Button">
        <Style.Triggers>
            <!-- 点击事件触发动画 -->
            <EventTrigger RoutedEvent="Click">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation 
                            Storyboard.TargetProperty="Opacity"
                            From="1" To="0.5" Duration="0:0:0.2" 
                            AutoReverse="True"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Style.Triggers>
    </Style>
三、模板示例
  1. ControlTemplate(控件模板)

    复制代码
    <Style TargetType="Button">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <!-- 自定义按钮外观 -->
                    <Border 
                        x:Name="border"
                        Background="LightGray" 
                        BorderBrush="Gray"
                        BorderThickness="2"
                        CornerRadius="5">
                        <ContentPresenter 
                            HorizontalAlignment="Center"
                            VerticalAlignment="Center"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsPressed" Value="True">
                            <Setter TargetName="border" Property="Background" Value="DarkGray"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
  2. DataTemplate(数据模板)

    复制代码
    <!-- 为ListBox中的User对象定义显示方式 -->
    <ListBox ItemsSource="{Binding Users}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Name}" Width="100"/>
                    <TextBlock Text="{Binding Age}" Width="50"/>
                    <TextBlock Text="{Binding Email}"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
四、数据绑定模式示例
  1. 绑定到元素

    复制代码
    <!-- Slider控制TextBox字体大小 -->
    <Slider x:Name="fontSizeSlider" Minimum="10" Maximum="30" Value="12"/>
    <TextBox 
        Text="绑定示例"
        FontSize="{Binding ElementName=fontSizeSlider, Path=Value}"/>
  2. 五种绑定模式

    复制代码
    <!-- 1. Default - 文本框默认双向 -->
    <TextBox Text="{Binding UserName}"/>
    
    <!-- 2. OneWay - 仅数据源更新UI -->
    <TextBlock Text="{Binding CurrentTime, Mode=OneWay}"/>
    
    <!-- 3. TwoWay - 双向同步 -->
    <CheckBox IsChecked="{Binding IsAgree, Mode=TwoWay}"/>
    
    <!-- 4. OneTime - 仅初始加载 -->
    <TextBlock Text="{Binding InitialSetupInfo, Mode=OneTime}"/>
    
    <!-- 5. OneWayToSource - 仅UI更新数据源 -->
    <Slider Value="{Binding FilterValue, Mode=OneWayToSource}"/>
  3. 绑定补充属性

    复制代码
    <!-- 格式化与更新时机 -->
    <TextBox 
        Text="{Binding Price, 
               StringFormat=C,  <!-- 货币格式 -->
               UpdateSourceTrigger=PropertyChanged}"/>  <!-- 实时更新 -->
    
    <!-- 绑定失败时显示默认值 -->
    <TextBlock Text="{Binding UnknownData, FallbackValue='无数据'}"/>

通过这些示例可以更直观地理解 WPF 中样式、触发器、模板和数据绑定的使用方式,实际开发中可以根据需求组合运用这些特性创建丰富的 UI 效果。

相关推荐
脑电信号要分类2 小时前
将多张图片拼接成一个pdf文件输出
pdf·c#·apache
njsgcs2 小时前
c# solidworks 折弯系数检查
开发语言·c#
格林威3 小时前
工业相机图像采集:Grab Timeout 设置建议——拒绝“假死”与“丢帧”的黄金法则
开发语言·人工智能·数码相机·计算机视觉·c#·机器视觉·工业相机
唐青枫4 小时前
C#.NET SignalR + Redis Backplane 深入解析:多节点部署与跨实例消息同步
c#·.net
bugcome_com5 小时前
WPF 命令 ICommand 从原理到实战
后端·wpf·icommand
FL162386312916 小时前
[C#][winform]segment-anything分割万物部署onnx模型一键抠图演示
开发语言·c#
love530love18 小时前
OpenClaw 手机直连配置全流程
人工智能·windows·python·智能手机·c#·agent·openclaw
bcbobo21cn19 小时前
C# byte类型和byte数组的使用
开发语言·c#·字节数组·byte类型
月巴月巴白勺合鸟月半21 小时前
一次PDF文件的处理(一)
pdf·c#
大鹏说大话1 天前
Java 锁膨胀机制深度解析:从偏向锁到重量级锁的进化之路
开发语言·c#