WPF 笔记 二


面板知识

介绍

Canvas
该面板可以设置每个子控件的坐标
WrapPanel
每个子控件按照水平(默认方式)或者竖直的方式满布一行或一列,让后再布置下一行或者下一列。基于最大的项目调整宽度或高度。当你需要水平或者竖直排列子控件且能自动滚动进入下一行(列)时采用他。
StackPanel
与 WrapPanel 很相似,但不会换行,尽量延长自己。但每个项目拉伸占满全宽或全高,而不是基于最大的项目调整宽度或高度
DockPanel
将子控件停靠在顶部、底部、左侧或右侧,最后一个子控件如果不指定,占满剩余空间
Grid
多行多列
以像素的绝对数量、可用空间的百分比或自动方式,其中行或列将根据内容自动调整其大小
UniformGrid
所有网格具有相同大小

Canvas

    <Canvas>
        <Ellipse Panel.ZIndex="2" Fill="Gainsboro" Canvas.Left="25" Canvas.Top="25" Width="200" Height="200" />
        <Rectangle Panel.ZIndex="3" Fill="LightBlue" Canvas.Left="25" Canvas.Top="25" Width="50" Height="50" />
        <Rectangle Panel.ZIndex="2" Fill="LightCoral" Canvas.Left="50" Canvas.Top="50" Width="50" Height="50" />
        <Rectangle Panel.ZIndex="4" Fill="LightCyan" Canvas.Left="75" Canvas.Top="75" Width="50" Height="50" />
    Canvas>

WrapPanel

    <WrapPanel>
        <Button>Test button 1Button>
        <Button>Test button 2Button>
        <Button>Test button 3Button>
        <Button Height="40">Test button 4Button>
        <Button>Test button 5Button>
        <Button>Test button 6Button>
    WrapPanel>

 StackPanel

垂直堆叠

    <StackPanel>
        <Button>Button 1Button>
        <Button>Button 2Button>
        <Button>Button 3Button>
        <Button>Button 4Button>
        <Button>Button 5Button>
        <Button>Button 6Button>
    StackPanel>

 水平堆叠

只需要加上

 <StackPanel Orientation="Horizontal">
    <StackPanel Orientation="Horizontal">
        <Button VerticalAlignment="Top">Button 1Button>
        <Button VerticalAlignment="Center">Button 2Button>
        <Button VerticalAlignment="Bottom">Button 3Button>
        <Button VerticalAlignment="Bottom">Button 4Button>
        <Button VerticalAlignment="Center">Button 5Button>
        <Button VerticalAlignment="Top">Button 6Button>
    StackPanel>

DockPanel

    <DockPanel>
        <Button DockPanel.Dock="Left">LeftButton>
        <Button DockPanel.Dock="Top">TopButton>
        <Button DockPanel.Dock="Right">RightButton>
        <Button DockPanel.Dock="Bottom">BottomButton>
        <Button>CenterButton>
    DockPanel>

可以为各个控件指定宽高

    <DockPanel>
        <Button DockPanel.Dock="Top" Height="50">TopButton>
        <Button DockPanel.Dock="Bottom" Height="50">BottomButton>
        <Button DockPanel.Dock="Left" Width="50">LeftButton>
        <Button DockPanel.Dock="Right" Width="50">RightButton>    
        <Button>CenterButton>
    DockPanel>
<DockPanel LastChildFill="False">

用此属性关闭最后一个控件铺满剩余空间。

Grid

 引子

    <Grid>
错误用法
        <Button>Button 1Button>
        <Button>Button 2Button>
    Grid>

像这样使用,第二个控件会覆盖第一个。

列划分简单例子

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        Grid.ColumnDefinitions>
        <Button>Button 1Button>
        <Button Grid.Column="1">Button 2Button>
    Grid>

默认的Grid.Column 为0

 在各个列中,不让button铺满,使用对齐

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        Grid.ColumnDefinitions>        
        <Button VerticalAlignment="Top" HorizontalAlignment="Center">Button 1Button>
        <Button Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Right">Button 2Button>
    Grid>

Grid行和列

ColumnDefinition RowDefinition 使用数字*指定比例关系

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="2*" />
            <ColumnDefinition Width="1*" />
            <ColumnDefinition Width="1*" />
        Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="2*" />
            <RowDefinition Height="1*" />
            <RowDefinition Height="1*" />
        Grid.RowDefinitions>
        <Button>Button 1Button>
        <Button Grid.Column="1">Button 2Button>
        <Button Grid.Column="2">Button 3Button>
        <Button Grid.Row="1">Button 4Button>
        <Button Grid.Column="1" Grid.Row="1">Button 5Button>
        <Button Grid.Column="2" Grid.Row="1">Button 6Button>
        <Button Grid.Row="2">Button 7Button>
        <Button Grid.Column="1" Grid.Row="2">Button 8Button>
        <Button Grid.Column="2" Grid.Row="2">Button 9Button>
    Grid>

Grid单位

ColumnDefinition RowDefinition除了*,

还有auto 和数字,分别表示占用控件text长度和绝对像素。

 Grid跨越

    <Grid>
        <Grid.ColumnDefinitions>            
            <ColumnDefinition Width="1*" />
            <ColumnDefinition Width="1*" />
        Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
        Grid.RowDefinitions>
        <Button>Button 1Button>
        <Button Grid.Column="1">Button 2Button>
        <Button Grid.Row="1" Grid.ColumnSpan="2">Button 3Button>
    Grid>

指定第二行跨越两列

Grid分割

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="5" />
            <ColumnDefinition Width="*" />
        Grid.ColumnDefinitions>
        <TextBlock FontSize="55" HorizontalAlignment="Center" VerticalAlignment="Center" TextWrapping="Wrap">Left sideTextBlock>
        <GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Stretch" />
        <TextBlock Grid.Column="2" FontSize="55" HorizontalAlignment="Center" VerticalAlignment="Center" TextWrapping="Wrap">Right sideTextBlock>
    Grid>

用户控件

新建WPF用户控件,名称LimitedInput

.xaml文件内容

<UserControl x:Class="WpfControlLibrary1.LimitedInput"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WpfControlLibrary1"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="Auto" />
        Grid.ColumnDefinitions>
        <Label Content="{Binding Title}" />
        <Label Grid.Column="1">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding ElementName=txtLimitedInput, Path=Text.Length}" />
                <TextBlock Text="/" />
                <TextBlock Text="{Binding MaxLength}" />
            StackPanel>
        Label>
        <TextBox MaxLength="{Binding MaxLength}" Grid.Row="1" Grid.ColumnSpan="2" Name="txtLimitedInput" ScrollViewer.VerticalScrollBarVisibility="Auto" TextWrapping="Wrap" />
    Grid>
UserControl>

对应cs文件

namespace WpfControlLibrary1
{
    /// <summary>
    /// UserControl1.xaml 的交互逻辑
    /// summary>
    public partial class LimitedInput : UserControl
    {
        public LimitedInput()
        {
            InitializeComponent();
            this.DataContext = this;
        }
        public string Title { get; set; }
        public int MaxLength { get; set; }
    }
}

使用

从工具栏拖入LimitedInput控件

 或者引用相应dll,

在相应Window的xaml文件中

        xmlns:uc="clr-namespace:WpfControlLibrary1;assembly=WpfControlLibrary1"

    <Grid>

        <uc:LimitedInput Title="Enter Title" MaxLength="100" Margin="40,25,418.6,295"/>

    Grid>