一、布局基础
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
通常用于控件(如ListBox
、ComboBox
、DataGrid
等)的项模板。
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>