WPF -- 前端XAML

一、布局基础

1.Grid(网格)

Grid 是一种灵活的布局控件,可以将子元素安排在行和列的网格中。每个子元素可以指定它所在的行和列。

1.代码示例

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/> <!--第一列占三分之一-->
        <ColumnDefinition Width="2*"/> <!--第二列占三分之二-->
    </Grid.ColumnDefinitions>

    <Grid.RowDefinitions>
        <RowDefinition Height="*"/> <!--第一行占三分之一-->
        <RowDefinition Height="2*"/> <!-- 第二行占三分之二-->
    </Grid.RowDefinitions>

    <Border Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="2" Background="ForestGreen"/> <!--第一个Boeder在一行一列,占据两列,背景为绿色-->
    <Border Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2" Background="Yellow"/> <!--第二个Boeder在二行一列,占据两列,背景为黄色-->
</Grid>

2.代码结果

2.StackPanel(堆栈面板)和 WrapPanel

StackPanel 是一种布局控件,可以将子元素沿水平或垂直方向堆叠排列。

1.代码示例

        <StackPanel Grid.Row="0" Grid.Column="0" Orientation="Vertical"> <!--默认为垂直排列,Vertical就代表水平排列,但是当容器不够的时候不会自动换行-->
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
        </StackPanel>

        <StackPanel Grid.Row="0" Grid.Column="1" Orientation="Horizontal"> <!--Horizontal水平排列-->
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
        </StackPanel>

        <WrapPanel Grid.Row="1" Grid.Column="0" Orientation="Vertical"> <!--相比stack panel可以自动换行或者换列-->
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
        </WrapPanel>

        <WrapPanel Grid.Row="1" Grid.Column="1" Orientation="Horizontal">
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
            <Button Height="50" Width="100"/>
        </WrapPanel>

2.代码结果

3.DockPanel(停靠面板)

DockPanel 是一种布局控件,可以将子元素停靠在容器的边缘。

功能:

    •    子元素可以停靠在上下左右四个方向
    •    中心区域可以填充剩余空间

1.代码示例

        <DockPanel LastChildFill="False"> <!--LastChildFill="False"取消默认填充剩余空间-->
            <Button Height="40" Width="60" DockPanel.Dock="Bottom"/> <!--停靠在底部-->
            <Button Height="40" Width="60" DockPanel.Dock="Left"/> <!--停靠在左边-->
            <Button Height="40" Width="60" DockPanel.Dock="Right"/> <!--停靠在右边-->
            <Button Height="40" Width="60" DockPanel.Dock="Top"/> <!--停靠在底部,并且默认填充剩余空间-->
        </DockPanel>

2.代码结果

4.UniformGrid

1.代码示例

        <UniformGrid Rows="3" Columns="3"> <!--自动使得元素均分界面-->
            <Button />
            <Button />
            <Button />
            <Button />
            <Button />
            <Button />
            <Button />
            <Button />
            <Button />
        </UniformGrid>

2.代码结果

5.Canvas(画布)

Canvas 是一种布局控件,可以通过绝对定位子元素。

功能:

    •    子元素使用坐标进行绝对定位
    •    适用于需要精确控制位置的场景

1.代码示例

        <Canvas>
            <Button Canvas.Left="10" Canvas.Top="10" Height="50" Width="200"/> <!--可以定义到上部和左部的距离-->
            <Button Canvas.Left="100" Canvas.Top="100" Height="50" Width="200"/>
        </Canvas>

2.代码结果

6.实例

1.代码示例

<Window x:Class="学习.MainWindow"
        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:学习"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="80"/>
            <RowDefinition/>
        </Grid.RowDefinitions>

        <Border Background="Blue"/>

        <Grid Grid.Row="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="80"/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>

            <Border  Grid.Column="0" Background="LightBlue"/>

            <Grid Grid.Column="1">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>

                <Grid.RowDefinitions>
                    <RowDefinition Height="90"/>
                    <RowDefinition/>
                    <RowDefinition/>
                </Grid.RowDefinitions>

                <Border  Margin="5" Background="Red"/>
                <Border  Margin="5" Background="Yellow" Grid.Column="1"/>
                <Border  Margin="5" Background="Blue" Grid.Column="2"/>
                <Border  Margin="5" Background="Green" Grid.Column="3"/>
                <Border  Margin="5" Background="OrangeRed" Grid.Column="4"/>

                <Border  Margin="5" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" Background="Green"/>
                <Border  Margin="5" Grid.Row="1" Grid.Column="3" Grid.ColumnSpan="2" Background="Red"/>
                <Border  Margin="5" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="3" Background="Blue"/>
                <Border  Margin="5" Grid.Row="2" Grid.Column="3" Grid.ColumnSpan="3" Background="Yellow"/>

            </Grid>
        </Grid>
    </Grid>
</Window>

2.代码结果

二、样式基础

1.代码示例

<Window x:Class="学习.MainWindow"
        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:学习"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <Window.Resources>
        <Style x:Key="BaseButtonStytle" TargetType="Button"><!--创建一个按键的公用基础样式-->
            <Setter Property="FontSize" Value="20"/><!--字体大小-->
            <Setter Property="Foreground" Value="Black"/><!--字体颜色-->
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value="LightBlue"/> <!--鼠标悬浮会变蓝色-->
                </Trigger>
            </Style.Triggers>
        </Style>

        <Style x:Key="ButtonStytle" TargetType="Button" BasedOn="{StaticResource BaseButtonStytle}"><!--继承共用基础样式的按键样式-->
            <Setter Property="Background" Value="Green"/><!--按键背景为绿色-->
        </Style>
    </Window.Resources>
    <Grid>
        <StackPanel>
            <Button Content="111" Style="{StaticResource ButtonStytle}" />
            <Button Content="111" Style="{StaticResource ButtonStytle}" />
            <Button Content="111" Style="{StaticResource ButtonStytle}" />
        </StackPanel>
    </Grid>
</Window>

2.代码结果

三、控件模板

1.操作过程

2.代码

<Window x:Class="学习.MainWindow"
        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:学习"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <Style x:Key="FocusVisual">
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Rectangle Margin="2" StrokeDashArray="1 2" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" SnapsToDevicePixels="true" StrokeThickness="1"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <SolidColorBrush x:Key="Button.Static.Background" Color="#FFDDDDDD"/>
        <SolidColorBrush x:Key="Button.Static.Border" Color="#FF707070"/>
        <SolidColorBrush x:Key="Button.MouseOver.Background" Color="#FFBEE6FD"/>
        <SolidColorBrush x:Key="Button.MouseOver.Border" Color="#FF3C7FB1"/>
        <SolidColorBrush x:Key="Button.Pressed.Background" Color="#FFC4E5F6"/>
        <SolidColorBrush x:Key="Button.Pressed.Border" Color="#FF2C628B"/>
        <SolidColorBrush x:Key="Button.Disabled.Background" Color="#FFF4F4F4"/>
        <SolidColorBrush x:Key="Button.Disabled.Border" Color="#FFADB2B5"/>
        <SolidColorBrush x:Key="Button.Disabled.Foreground" Color="#FF838383"/>
        <Style x:Key="ButtonStyle1" TargetType="{x:Type Button}">
            <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
            <Setter Property="Background" Value="{StaticResource Button.Static.Background}"/>
            <Setter Property="BorderBrush" Value="{StaticResource Button.Static.Border}"/>
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="HorizontalContentAlignment" Value="Center"/>
            <Setter Property="VerticalContentAlignment" Value="Center"/>
            <Setter Property="Padding" Value="1"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Border x:Name="border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="true">
                            <ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsDefaulted" Value="true">
                                <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                            </Trigger>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter Property="Background" TargetName="border" Value="{StaticResource Button.MouseOver.Background}"/>
                                <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.MouseOver.Border}"/>
                            </Trigger>
                            <Trigger Property="IsPressed" Value="true">
                                <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Pressed.Background}"/>
                                <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Pressed.Border}"/>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Disabled.Background}"/>
                                <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Disabled.Border}"/>
                                <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Button.Disabled.Foreground}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>


    <Grid>
        <StackPanel>
            <Button Style="{DynamicResource ButtonStyle1}" >
                <StackPanel Orientation="Horizontal">
                    <Button Content="1"/>
                    <Button Content="2"/>
                    <Button Content="3"/>
                </StackPanel>
            </Button>
        </StackPanel>
    </Grid>
</Window>

3.代码结果

4.总结

通过引用微软库中的Buttton样式代码,可以自定义改变控件的样式,主要是通过改变如下部分。

<ContentPresenter x:Name="contentPresenter"
                  Focusable="False" 
                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                  Margin="{TemplateBinding Padding}" 
                  RecognizesAccessKey="True" 
                  SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>

5.热重载工具

在调试窗口界面上方就可以实现很方便的调试功能。

四、数据模板

1.DataTemplate

在WPF(Windows Presentation Foundation)中,DataTemplate 用于定义数据的可视化呈现方式。它允许你自定义如何展示数据对象,从而实现更灵活和丰富的用户界面。DataTemplate 通常用于控件(如ListBoxComboBoxDataGrid等)的项模板。

1.代码示例

1.1 xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;

namespace 学习
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            List<Color> test = new List<Color>();

            test.Add(new Color() { Code = "Red", Name = "红色" });
            test.Add(new Color() { Code = "BLUE", Name = "蓝色" });
            test.Add(new Color() { Code = "YELLOW", Name = "黄色" });
            test.Add(new Color() { Code = "GREEN", Name = "绿色" });

            list.ItemsSource = test;
        }
    }

    public class Color
    {
        public string Code { get; set; }

        public string Name { get; set; }
    }
}
1.2 xaml
<Window x:Class="学习.MainWindow"
        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:学习"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <Grid>
        <ListBox x:Name="list">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Border Width="10" 
                                Height="10"
                                Background="{Binding Code}">
                        </Border>
                        <TextBlock Margin="10,0" 
                                   Text="{Binding Name}">
                        </TextBlock>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>

2.代码结果

3.代码示例2

后端不变

<Window x:Class="学习.MainWindow"
        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:学习"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <Grid>
        <DataGrid
            x:Name="list"
            AutoGenerateColumns="False"
            CanUserAddRows="False">
            <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Name}" Header="Name"/>
            <DataGridTextColumn Binding="{Binding Code}" Header="Code"/>

                <DataGridTemplateColumn Header="操作"><!--可操作的-->
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <Border Width="10"
                                        Height="10"
                                        Background="{Binding Code}">
                                </Border>
                                <TextBlock Margin="10" Text="{Binding Name}">
                                </TextBlock>
                            </StackPanel>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

4.代码结果

五、WPF绑定

1.双向绑定

1.代码示例

<Window x:Class="学习.MainWindow"
        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:学习"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <Grid>
        <StackPanel>
            <Slider x:Name="slider" Margin="10"/>
            <TextBox Height="30"  Margin="10" Text="{Binding ElementName=slider,Path=Value}"/>
            <TextBox Height="30"  Margin="10" Text="{Binding ElementName=slider,Path=Value}"/>
            <TextBox Height="30"  Margin="10" Text="{Binding ElementName=slider,Path=Value}"/>
        </StackPanel>
    </Grid>
</Window>

2.代码结果

2.单向绑定

1.代码示例

<Window x:Class="学习.MainWindow"
        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:学习"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <Grid>
        <StackPanel>
            <Slider x:Name="slider" Margin="10"/>
            <TextBox Height="30"  Margin="10" Text="{Binding ElementName=slider,Path=Value,Mode=OneWay}"/> <!--单向绑定-->
            <TextBox Height="30"  Margin="10" Text="{Binding ElementName=slider,Path=Value,Mode=OneTime}"/><!--绑定第一个数值-->
            <TextBox Height="30"  Margin="10" Text="{Binding ElementName=slider,Path=Value,Mode=TwoWay}"/><!--双向绑定-->
            <TextBox Height="30"  Margin="10" Text="{Binding ElementName=slider,Path=Value,Mode=OneWayToSource}"/><!--单向绑定-->
        </StackPanel>
    </Grid>
</Window>

2.代码结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值