基于.NET6的WPF基础总结(上)

目录

一.常用属性介绍

二、 程序退出方式

三、布局样式

3.1 Panel的附加属性ZIndex

3.2 Grid(网格)布局

3.3 UniformGrid(均分布局)

3.4 StackPanel(堆积面板)

3.5 WrapPanel(换行面板) 

3.6  DockPanel(停靠面板)

3.7 Canvas(画布布局) 

 3.8 个性化Border

3.9  GridSplitter(分割窗口)

 四、内容控件

4.1 Control类

 4.2 Button按钮

 4.3 CheckBox复选框

 4.4 RadioButton单选框

 4.5 RepeatButton重复按钮

 4.6 Label控件

4.6.1  Label直接显示文本

4.6.2 label和访问修饰符  

 4.6.3 使用控件作为Label的内容

4.7  TextBox

4.8 PasswordBox密码框

4.9 RichTextBox富文本控件

  4.9.1 获取富文本内容

4.9.2 动态创建富文本内容

 4.9.3 加载文件内容到富文本

4.10 ToolTip提示工具

4.10.1 自定义ToolTip内容

 4.11 Popup弹出窗口

 4.12 Image图片

4.12.1 圆形图片

 4.13 GroupBox分组容器

 4.13.1 基本使用

 4.13.2 自定义header属性

4.14 ScrollViewer 视图滚动控件

4.15 Slider 滑块

4.16 ProgressBar进度条

4.17 Calendar日历控件

4.18 DatePicker日期选择控件


一.常用属性介绍

  •    Icon: 指定窗口的图标

  •  Title: 窗口标题

  •  WindowStyle:控制界面边框样式
  1. None-无边框   (窗口无法拖动)
  2.  SingleBorderWindow-单边框(默认)
  3. ThreeDBorderWindow-3D边框 
  4. ToolWindow-工具箱窗口(只有标题和删除界面图标)
  • ResizeMode:指定窗口大小调节样式
  1. NoResize:不能调节、并且没有窗口最大最小按钮
  2. CanMinimize:不能调节,有最小化按钮
  3. CanResize:可调节(默认)
  4. CanResizeWithGrip: 可根据网格调节
  • Topmost: 调节窗口前后顺序,为true时窗口位于最前,都为true时根据顺序决定
  • Height、Width、MaxHeight、MaxWidth:高度、宽度、最大高度、最大宽度
  • SizeToContent:表示窗体大小决定方式
  1. Manual:手工决定(可以自由改变)
  2. Width:宽度决定
  3. Height:高度决定
  4. WidthAndHeight:内容决定
  • Visibility:窗口可见性
  1. Visible:可见
  2. Hidden:隐藏
  3. Collapsed:折叠
  • WindowState: 窗口状态
  1. Normal:正常
  2. Maximized:最大化
  3. Minimized:最小化
  • WindowStartupLocation:窗口启动时位置
  1. CenterScreen:正中间

二、 程序退出方式

  • close():关闭当前窗口
private void Button_Close(object sender, RoutedEventArgs e)
{
    this.Close();
}
  • Application.Current.Shutdown():关闭UI,但后台进程没有关闭,只到所有后台进程关闭才关闭
private void Button_Exit(object sender, RoutedEventArgs e)
{
    Application.Current.Shutdown();
}
  •  Environment.Exit(0):强制退出(不会执行finally,但是会进行资源清理)
private void Button_Exit(object sender, RoutedEventArgs e)
{
   Environment.Exit(0);
}
  •  Process.GetCurrentProcess().Kill():强制退出(不会进行资源清理)
private void Button_Exit(object sender, RoutedEventArgs e)
{
    Process.GetCurrentProcess().Kill();
}

三、布局样式

3.1 Panel的附加属性ZIndex

        当我们在Grid中定义两个Button的时候,我们可以看到只会显示出按钮2,因为两个按钮重叠在了一起,那么如果我们要自由选择显示哪一个按钮改怎么实现呢?

 我们在Button中加上Panel的附加属性ZIndex后,就可以根据值的大小选择需要显示的内容,比如下面的代码展示的效果则是按钮1被显示

<Grid>
    <Button Panel.ZIndex="1" Content="按钮1" Height="30" Width="200" />
    <Button Panel.ZIndex="0" Content="按钮2" Height="30" Width="200" />
</Grid>

3.2 Grid(网格)布局

  • 定义行和列
   <Grid ShowGridLines="True">
       <!--两行-->
       <Grid.RowDefinitions>
           <RowDefinition />
           <RowDefinition />
       </Grid.RowDefinitions>
       <!--两列-->
       <Grid.ColumnDefinitions>
           <ColumnDefinition />
           <ColumnDefinition />
       </Grid.ColumnDefinitions>

       <!--不写默认是第一行 or 第一列-->
       <TextBlock Text="文本1" />
       <!--Grid.Row: 哪一行 Grid.Column:那一列-->
       <TextBlock Grid.Row="1" Grid.Column="0" Text="文本2" />
       <TextBlock Grid.Row="0" Grid.Column="1" Text="文本3" />
       <TextBlock Grid.Row="1" Grid.Column="1" Text="文本4" />
   </Grid>

  •  合并行和合并列
<Grid ShowGridLines="True">
    <!--两行-->
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <!--两列-->
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <!--Grid.ColumnSpan:合并列  Grid.RowSpan:合并行-->
    <TextBlock Grid.ColumnSpan="2" Text="合并列" VerticalAlignment="Center" HorizontalAlignment="Center" />
    <TextBlock Grid.RowSpan="2" Text="合并行" VerticalAlignment="Center" HorizontalAlignment="Center" />
</Grid>

  • 设置行和列高度的几种方式 

        1. 给具体的值

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

        2. 根据内容大小自动变换

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

        3. 设置比例

如下表示将整个网格设置为8等份,第一行占3份,第二行占五份

 <Grid.RowDefinitions>
     <RowDefinition Height="3*" />
     <RowDefinition Height="5*" />
 </Grid.RowDefinitions>

3.3 UniformGrid(均分布局)

        UniformGrid与Grid网格布局十分相似,只是UniformGrid的每个单元格面积都是相等的,单元格会平分整个UniformGrid。

  • 定义一个两行两列的单元格

        定义方式特别简单,只需要在UniformGrid中设置Rows和Columns即可

  •  FirstColumn属性的使用

        FirstColumn代表第一行我要空多少格,被挤掉的格子会在布局外部显示,但是运行项目的时候是看不到的

3.4 StackPanel(堆积面板)

        StackPanel用于水平或者垂直堆叠子元素

<StackPanel>
    <Button Content="button01" />
    <Button Content="button01" />
    <Button Content="button01" />
    <Button Content="button01" />
    <Button Content="button01" />
</StackPanel>

        设置Orientation="Horizontal"后

3.5 WrapPanel(换行面板) 

        当一行或者一列内容放不下时,自动切换到另一行或另一列,提供了三个参数:Orientation-设置排列方式,ItemWidth-设置子项宽度,ItemHeight-设置子项高度

3.6  DockPanel(停靠面板)

3.7 Canvas(画布布局) 

 3.8 个性化Border

<Canvas>
    <!--BorderThickness:边框厚度,可以设置为BorderThickness="左,上,右,下" BorderBrush:边框颜色 CornerRadius:边框圆角-->
    <Border Canvas.Left="20" Canvas.Top="20" BorderThickness="1" Width="100" Height="30" BorderBrush="red">
        <TextBlock Text="button" VerticalAlignment="Center" HorizontalAlignment="Center" />
    </Border>
    <Border Canvas.Left="20" Canvas.Top="80" BorderThickness="1" Width="100" 
            Height="30" BorderBrush="Blue" CornerRadius="10" Background="Coral">
        <TextBlock Text="button" VerticalAlignment="Center" HorizontalAlignment="Center" />
    </Border>

    <!--需要注意,设置圆的时候长和宽需要一样,并且CornerRadius >= Width/2 or Height/2 -->
    <Border Canvas.Left="20" Canvas.Top="150" BorderThickness="1" Width="100" Height="100"
            BorderBrush="Green" Background="Yellow" CornerRadius="50">
        <TextBlock Text="button" VerticalAlignment="Center" HorizontalAlignment="Center" />
    </Border>
</Canvas>

3.9  GridSplitter(分割窗口)

        GridSplitter用于分割窗口的布局,可以通过鼠标实现左右或者上下的拖动

使用注意事项:

  1. 该属性必须在Grid布局中使用。
  2. 如果要实现左右拖动改变窗口的大小需要设置HorizontalAlignment="Center";
  3. 如果要实现上下拖动改变窗口的大小需要设置VerticalAlignment="Center";
  4. 默认是实时查看改变大小,当设置ShowsPreview="True"时,鼠标取消拖动后才会显示。
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <Border Background="Aqua">
        <!--TextWrapping="Wrap": 自动换行-->
        <TextBlock TextWrapping="Wrap">
        1111111111111111111111111111111111111111111111
        </TextBlock>
    </Border>

    <GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Center" ShowsPreview="True" />

    <Border Grid.Column="2" Background="Yellow">
        <TextBlock TextWrapping="Wrap">
         2222222222222222222222222222222222222222222222222222222
        </TextBlock>
    </Border>
</Grid>

 四、内容控件

4.1 Control类

        Control类是很多控件的基类,而内容控件与布局控件的不同在于布局控件专注于界面设计,内容控件专注于数据。

        Control在界面上不会有任何的显示,但是Control提供了一个控件模板Control.Template,几乎所有子类对Control.Template都进行了各自的实现,所以只有继承了Control的子类才会在界面上显示。

<Control>
    <Control.Template>
        <ControlTemplate TargetType="Control">
            <Border Width="200" Height="200" Background="Yellow" CornerRadius="100">
                <TextBlock Text="button" VerticalAlignment="Center" HorizontalAlignment="Center">
                    
                </TextBlock>
            </Border>
        </ControlTemplate>
    </Control.Template>
</Control>

 4.2 Button按钮

Button按钮自带的有三个属性:

  1. IsDefault:表示该Button是一个默认按钮,可以直接通过Enter键调用
  2. IsCancel:表示该Button是一个取消按钮,可以通过Esc键直接调用
  3. IsDefaulted:表示是否在用户按下Enter后才激活的按钮

 Button自定义样式:

<Canvas>
    <Button Width="120" Height="30" Content="圆角按钮" Canvas.Left="50" Canvas.Top="50">
        <Button.Template>
            <ControlTemplate TargetType="Button">
                <!--TemplateBinding BorderBrush: 获取边框默认的颜色-->
                <Border CornerRadius="15" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1" Background="Yellow">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>

                        <Image Source="Images/csharp.png" Width="60" Height="20" />
                        <!--ContentPresenter:自动获取Button中content的值-->
                        <ContentPresenter Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center" />
                    </Grid>
                </Border>
            </ControlTemplate>
        </Button.Template>
    </Button>
</Canvas>

 4.3 CheckBox复选框

        我们在StackPanel布局中定义三个复选框,为每个复选框绑定OnCheck检查事件,判断该复选框是被被选择,然后定义一个Button,绑定事件Show

<StackPanel x:Name="Select">
    <TextBlock Text="你知道的编程语言:" Margin="5,5,0,0" />
    <CheckBox Content="C语言" Checked="OnCheck" Margin="5,5,0,0" />
    <CheckBox Content="C++语言" Checked="OnCheck" Margin="5,5,0,0" />
    <CheckBox Content="C#语言" Checked="OnCheck" Margin="5,5,0,0" />

    <Button Content="查看选择" Width="100" HorizontalAlignment="Left" Margin="5,5,0,0" Click="Show" />
</StackPanel>
private void Show(object sender, RoutedEventArgs e)
{
    StringBuilder show = new StringBuilder();
    // 遍历Select下的所有子控件,Select是我在xaml中给Pannel布局定义的名字
    foreach (var item in Select.Children)
    {
        if (item is CheckBox)
        {
            // 判断是否选中
            if ((item as CheckBox).IsChecked == true)
            {
                show.Append((item as CheckBox).Content + " ");
            }
        }
    }
    if (show.Length > 0)
    {
        MessageBox.Show(show.ToString());
    }
}

private void OnCheck(object sender, RoutedEventArgs e)
{
    int total = 0;
    foreach (var item in Select.Children)
    {
        if (item is CheckBox)
        {
            total += (item as CheckBox).IsChecked == true? 1 : 0;
        }
    }
    // 最多选择两个
    if (total > 2)
    {
        // sender: 是当前选中的CheckBox
        var cbx = sender as CheckBox;
        if (cbx.IsChecked == true) // 判断是否是选中状态
        {
            cbx.IsChecked = false;
            MessageBox.Show("最多只能选两个");
        }

        
    }
}

 4.4 RadioButton单选框

<StackPanel>
    <StackPanel Orientation="Horizontal" x:Name="Select">
        <TextBlock Text="性别" Margin="5,0,0,0" />
        <!--GroupName用于对单选框进行分组-->
        <RadioButton Content="男" GroupName="sex" Margin="10,0,0,0" />
        <RadioButton Content="女" GroupName="sex" Margin="10,0,0,0" />
    </StackPanel>

    <Button Content="查看" Width="100" HorizontalAlignment="Left" Margin="5,20,0,0" Click="Show" />
</StackPanel>
private void Show(object sender, RoutedEventArgs e)
{
    foreach (var sex in Select.Children)
    {
        if (sex is RadioButton { IsChecked: true } str)
        {
            MessageBox.Show(str.Content.ToString());
        }
    }
}

 4.5 RepeatButton重复按钮

         这个按钮事件是当我们按下鼠标后会一直重复执行,直到我们松开鼠标键,其中具有两个重要的属性:

  • Delay:点击后隔多久开始重复执行
  • Interval:重复执行函数的间隔时间

注意:想要打开控制台查看输出效果需要设置:鼠标右键点击你的解决方案,选择【属性】--> 输出类型修改为控制台应用程序

<Grid>
   <RepeatButton Width="50" Height="30" Content="button" Click="repeatButton" Delay="3000" Interval="2000" />
</Grid>
private int total = 0;
private void repeatButton(object sender, RoutedEventArgs e)
{
    Console.WriteLine($"点击了{++total}次,当前时间:{DateTime.Now}");
}

 4.6 Label控件

4.6.1  Label直接显示文本

        当我们在Label中添加Content时,Label实际上会在内部创建一个TextBlock来显示我们的内容,但是Label会默认为其加上边距

<StackPanel>
    <Label Content="hello" />
</StackPanel>

4.6.2 label和访问修饰符  

        当我们设置了访问修饰符后,程序运行时我们按住【Alt】键,被我们修饰的子元符会高亮显示,通过【Alt】+"所设置的字符"可以将焦点切换到对应的Label中。

<StackPanel>
    <!--_后面的字符就是被我们修饰的字符,可以放在任何字符的前面-->
    <Label Margin="20,0,0,0" Content="_Name" Target="{Binding ElementName=txtName}" />
    <TextBox x:Name="txtName" Margin="20,0,50,0" />
    <Label Margin="20,0,0,0" Content="S_ex" Target="{Binding ElementName=txtSex}" />
    <TextBox x:Name="txtSex" Margin="20,0,50,0" />
</StackPanel>

        此时运行项目,点击【Alt】,会将我们修饰的字符通过下划线的方式进行显示,如果我们再按“e”,焦点会在Sex中。

 4.6.3 使用控件作为Label的内容

<StackPanel>
    <!--Binding ElementName=txtName:绑定需要被聚焦的文本框-->
    <Label Target="{Binding ElementName=txtName}">
        <StackPanel Orientation="Horizontal" Margin="50,0">
            <Image Source="Images/csharp.png" Width="20" Height="20" />
            <!--AccessText才可以定义访问键-->
            <AccessText Text="_CSharp" VerticalAlignment="Center" />
        </StackPanel>
    </Label>
    <TextBox x:Name="txtName" Margin="50,0" />
</StackPanel>

4.7  TextBox

        在TextBox中具有许多的属性,下面我列举一些比较常用的

MinLines最小可见行数
MaxLines最大可见行数
Text文本内容
CharacterCasing是否转换成大小写
VerticalScrollBarVisibility是否显示拉条
MaxLength一行的最大字符长度
TextAlignment设置文本水平方向位置
VerticalContentAlignment设置文本垂直方向位置
TextWrapping是否自动换行

4.8 PasswordBox密码框

  • PasswordChar:改变密码框中内容默认显示符号
  • PasswordChanged: 密码改变时执行事件
<StackPanel Margin="20">
    <PasswordBox />
</StackPanel>

4.9 RichTextBox富文本控件

        RichTextBox可用于显示,输入和操作格式文本。可以实现TextBox的全部功能外,还提供了富文本的显示功能,同时我们可以对文本内容进行编辑。

需要注意:FlowDocumentFlowDocument RichTextBoxRichTextBox唯一支持的子元素是FlowDocument RichTextBox

<StackPanel>
    <RichTextBox x:Name="content">
        <FlowDocument>
            <Paragraph>
                <Run>Paragraph 1</Run>
            </Paragraph>
            <Paragraph>
                <Run>Paragraph 2</Run>
            </Paragraph>
            <Paragraph>
                <Run>Paragraph 3</Run>
            </Paragraph>
        </FlowDocument>
    </RichTextBox>
</StackPanel>

  4.9.1 获取富文本内容

        给RichTextBox设置Name,通过button可以获取富文本的内容

private void getContent(object sender, RoutedEventArgs e)
{
    // 获取文本框内容,content是我们给RichTextBox设置的Name
    TextRange tr = new TextRange(content.Document.ContentStart, content.Document.ContentEnd);
    MessageBox.Show(tr.Text);
}

4.9.2 动态创建富文本内容

<StackPanel>
    <RichTextBox x:Name="content">

    </RichTextBox>
</StackPanel>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        // 创建FlowDocument对象
        FlowDocument flowDocument = new FlowDocument();
        content.Document = flowDocument;

        // 创建段落
        Paragraph paragraph = new Paragraph();
        paragraph.Foreground = Brushes.Blue;
        paragraph.Inlines.Add("hello");

        Paragraph paragraph2 = new Paragraph();
        paragraph2.Foreground = Brushes.Green;
        paragraph2.Inlines.Add("world");

        // 将段落添加到文档中
        flowDocument.Blocks.Add(paragraph);
        flowDocument.Blocks.Add(paragraph2);
    }
}

 4.9.3 加载文件内容到富文本

        可以设置一个Button,然后给Button绑定事件,可以实现将文件中的内容显示出来

private void Upload(object sender, RoutedEventArgs e)
{
    OpenFileDialog file = new OpenFileDialog();
    file.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*";
    if (file.ShowDialog() == true)
    {
        TextRange txt = new TextRange(content.Document.ContentStart, content.Document.ContentEnd);
        using var stream = new FileStream(file.FileName, FileMode.Open, FileAccess.Read);
        txt.Load(stream, DataFormats.Text);
    }
}

4.10 ToolTip提示工具

        ToolTip可以显示所有 任何类型,比如图像,字符, 其他控件等  

当我们将鼠标放在Button上时,会显示出设定好的文字“hello” 

<StackPanel>
    <Button Content="鼠标放过来" ToolTip="hello" />
</StackPanel>

4.10.1 自定义ToolTip内容

<StackPanel>
    <Button Width="100" Content="鼠标放过来">
        <Button.ToolTip>
            <StackPanel>
                <TextBlock>hello</TextBlock>
                <Border Width="100" Height="100">
                    <Image Source="Images/csharp.png" />
                </Border>
            </StackPanel>
        </Button.ToolTip>
    </Button>
</StackPanel>

 4.11 Popup弹出窗口

AllowsTransparency控件是否包含透明内容
PopupAnimation控件打开或关闭时的动画效果。None:没有效果;Fade:逐渐显示或淡出;Slide:向上向下划入;Scroll:滚动效果
PlacementRectangle弹窗打开的位置
PlacementTarget在那个控件身边打开
StaysOpen默认为true,表示弹窗打开后,如果失去焦点是否继续显示
IsOpen设置弹窗是否显示

小案例如下:

<StackPanel>
    <TextBox x:Name="Menu" Width="100" Margin="0,20" GotFocus="got" LostFocus="lost" />
    <Popup x:Name="myPopup" PlacementTarget="{Binding ElementName=Menu}"
           Width="{Binding ElementName=Menu,Path=ActualWidth}" >
        <ListBox x:Name="list" SelectionChanged="ListBoxSelect">
            <ListBoxItem Content="item1" />
            <ListBoxItem Content="item2" />
            <ListBoxItem Content="item3" />
            <ListBoxItem Content="item4" />
        </ListBox>
    </Popup>
</StackPanel>
private void got(object sender, RoutedEventArgs e)
{
    myPopup.IsOpen = true;
}

private void lost(object sender, RoutedEventArgs e)
{
    myPopup.IsOpen = false;
}

private void ListBoxSelect(object sender, SelectionChangedEventArgs e)
{
    Menu.Text = (list.SelectedItem as ListBoxItem).Content.ToString();
}

 4.12 Image图片

Source图片来源
StretchDirection

图片缩放条件。

UpOnly:仅在小于父级时缩放;DownOnly:仅在大于父级时缩放;Both:兼容前两者

Stretch

图片缩放模式。

None:保持原始大小;Fill:调整内容大小以填充目标尺寸;Uniform:保持纵横比基础上缩放;UniformToFill:保持纵横比基础上缩放,还具有裁剪功能;

4.12.1 圆形图片

<StackPanel>
    <Ellipse Width="200" Height="200">
        <Ellipse.Fill>
            <ImageBrush ImageSource="Images/csharp.png" />
        </Ellipse.Fill>
    </Ellipse>
</StackPanel>

 4.13 GroupBox分组容器

 4.13.1 基本使用

<Grid Width="400" Margin="0,40">
    <!--定义行-->
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>

    <GroupBox Header="基本信息">
        <!--定义第一行内部-->
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>

            <TextBlock Text="姓名:" VerticalAlignment="Center" Margin="2,0" />
            <TextBox Grid.Column="1" Width="200" Height="20" HorizontalAlignment="Left" Margin="5,0" />
            <TextBlock Grid.Row="1" Text="性别:" VerticalAlignment="Center" Margin="2,0" />
            <WrapPanel Grid.Row="1" Grid.Column="1" Width="200" Height="30" HorizontalAlignment="Left">
                <RadioButton Content="男" GroupName="sex" Margin="7" />
                <RadioButton Content="女" GroupName="sex" Margin="7" />
            </WrapPanel>
        </Grid>
    </GroupBox>
</Grid>

 4.13.2 自定义header属性

<GroupBox.Header>
    <StackPanel Orientation="Horizontal">
        <Image Source="Images/csharp.png" Width="20" />
        <TextBlock Text="基本信息" VerticalAlignment="Center" Margin="5,0" />
    </StackPanel>
</GroupBox.Header>

4.14 ScrollViewer 视图滚动控件

        当在一个固定大小的布局格子中的内容查出格子范围时可以使用ScrollViewer;

<ScrollViewer>
    <!--定义第一行内部-->
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="200" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>

        <TextBlock Text="姓名:" VerticalAlignment="Center" Margin="2,0" />
        <TextBox Grid.Column="1" Width="200" Height="20" HorizontalAlignment="Left" Margin="5,0" />
        <TextBlock Grid.Row="1" Text="性别:" VerticalAlignment="Center" Margin="2,0" />
        <WrapPanel Grid.Row="1" Grid.Column="1" Width="200" Height="30" HorizontalAlignment="Left">
            <RadioButton Content="男" GroupName="sex" Margin="7" />
            <RadioButton Content="女" GroupName="sex" Margin="7" />
        </WrapPanel>
    </Grid>
</ScrollViewer>

4.15 Slider 滑块

        案例:通过Slider控制图片的透明度

<Grid Width="400" Margin="0,40">
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <Image Source="Images/csharp.png" Width="200" Height="200" Opacity="{Binding ElementName=slider, Path=Value}"/>

    <!--Value:默认透明度 Maximum:最大值-->
    <Slider x:Name="slider" Value="0.3" Grid.Row="1" Maximum="1" />
</Grid>

4.16 ProgressBar进度条

<StackPanel VerticalAlignment="Center">
    <ProgressBar x:Name="progress" Width="200" Height="10" Maximum="100" />
    <TextBlock x:Name="txt" VerticalAlignment="Center" HorizontalAlignment="Center">
        0%
    </TextBlock>
</StackPanel>

4.17 Calendar日历控件

4.18 DatePicker日期选择控件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/872441.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在模板中使用 Django 会话

在 Django 中使用会话&#xff08;session&#xff09;可以让你在用户访问网站的过程中存储和访问临时数据。我们可以利用会话在速度计算器的例子中存储和显示上次计算的结果。 1、问题背景 在 Django 中&#xff0c;可以使用会话来存储用户数据。在某些情况下&#xff0c;我们…

俄罗斯版微信遭遇大规模数据泄露,安全问题再引关注

据报道&#xff0c;俄罗斯最大的社交媒体和网络服务VK&#xff08;VKontakte&#xff09;遭遇了大规模的数据泄露事件&#xff0c;该事件对大量用户造成了影响。据非法市场BreachForums上一位名为Hikki-Chan的威胁行为者声称&#xff0c;2024年9月&#xff0c;VK的数据在论坛上…

Stream 流式编程

优质博文&#xff1a;IT-BLOG-CN 大家都知道可以将Collection类转化成流Stream进行操作&#xff08;Map并不能创建流&#xff09;&#xff0c;代码变得简约流畅。我们先看下流的几个特点&#xff1a; 1、流并不存储元素。这些元素可能存储在底层的集合中&#xff0c;或者是按需…

VMwareWorkstation安装Kali系统教程

Kali系统&#xff0c;全名为Kali Linux&#xff0c;为渗透测试和网络安全领域提供一个全面的工具集合。Kali系统预装了各种用于渗透测试和漏洞利用的工具&#xff0c;包括端口扫描、密码破解、网络嗅探、漏洞分析等。这些工具可以帮助安全专业人员评估和测试网络的安全性&#…

实例讲解Simulink应用层开发CAN报文解包及CAN信号设置方法

在VCU应用层开发中&#xff0c;在输入信号中主要包括开关信号、模拟信号、CAN信号、PWM信号等&#xff0c;其中CAN通讯由于通讯质量高&#xff0c;传输数据量大&#xff0c;采用总线通讯方式节省大量线束&#xff0c;在汽车上尤其是电动汽车上大量应用&#xff0c;当然&#xf…

数图亮相第三届中国区域零售创新峰会:共绘零售新蓝图,携手迈向新征程

8月31日&#xff0c;备受瞩目的第三届中国区域零售创新峰会在历史悠久的湖北襄阳圆满落下帷幕。在这场零售行业的盛会上&#xff0c;数图信息科技作为重要参会企业&#xff0c;积极参与其中&#xff0c;与众多行业精英共聚一堂&#xff0c;共同擘画零售业的宏伟蓝图。以下是本次…

C/C++ 中的算术运算及其陷阱(详解,举例分析)

在C/C编程中&#xff0c;算术运算是非常基础且常用的操作。然而&#xff0c;这些看似简单的运算背后却隐藏着一些潜在的陷阱&#xff0c;如果不加以注意&#xff0c;可能会导致程序出现难以预料的错误。本文将探讨C/C中常见的算术运算及其潜在的陷阱&#xff0c;并通过实例进行…

告别格式不兼容烦恼!ape转换mp3,分享3个简单方法

各位读者们&#xff0c;你们是否有过这种体验&#xff1a;满怀期待地在网上下载一首好听的歌曲&#xff0c;结果怎么点击手机都播放不了&#xff0c;定睛一看&#xff0c;弹窗显示“无法播放该音频文件”。这是为什么呢&#xff1f;原来那首歌的音频格式是ape&#xff0c;不被手…

iOS——关联对象学习补充

分类 在分类中添加属性会生成对应的成员变量&#xff0c;会生成对应的setter和getter方法的声明&#xff0c;但是不会生成setter和getter方法的实现。分类中的可以写property&#xff0c;会编译通过&#xff0c;但是引用变量会报错。分类中可以/只能访问原有类中.h中的属性。如…

如何选择合适的变压吸附制氧设备

在选择合适的变压吸附(Pressure Swing Adsorption, PSA)制氧设备时&#xff0c;需要综合考虑多个因素以确保设备能够高效、稳定地运行&#xff0c;满足特定应用场景的需求。以下是一些关键步骤和考虑因素&#xff0c;帮助您做出明智的决策。 1. 明确应用需求 明确您的制氧需求至…

visual studio 2022更新以后,之前的有些工程编译出错,升级到Visual studio Enterprise 2022 Preview解决

系列文章目录 文章目录 系列文章目录前言一、解决方法 前言 今天遇到一个问题&#xff1a;visual studio 2022升级成预览版以后&#xff0c;之前的有些工程编译出错。首先代码、项目设置都没有改变&#xff0c;只是更新了visual studio 2022。 在编译工程时&#xff0c;编译器…

Team Render 上的 Redshift 照明与我的编辑机器上的不同(如何缓存 Redshift GI)

有时&#xff0c;您的灯光在另一台机器&#xff08;例如属于 Team Render 农场的机器&#xff09;上看起来会与在主/编辑机器上看起来不同。这是因为&#xff0c;即使使用相似或相同的硬件&#xff0c;一台机器计算全局照明的方式与另一台机器也会有所不同。 这可能会导致光线…

Docker 部署 Kibana (图文并茂超详细)

部署 Kibana ( Docker ) [Step 1] : 拉取 Kibana 镜像 docker pull kibana:7.14.0[Step 2] : 创建目录 ➡️ 启动容器 ➡️ 拷贝文件 ➡️ 授权文件 ➡️ 删除容器 # 创建目录 mkdir -p /data/kibana/{conf,plugins}# 启动容器 docker run --name kibana --restartalways \…

科普神文,一次性讲透AI大模型的核心概念

令牌&#xff0c;向量&#xff0c;嵌入&#xff0c;注意力&#xff0c;这些AI大模型名词是否一直让你感觉熟悉又陌生&#xff0c;如果答案肯定的话&#xff0c;那么朋友&#xff0c;今天这篇科普神文不容错过。我将结合大量示例及可视化的图形手段&#xff0c;为你由浅入深一次…

Centos Stream9系统安装及网络配置详解

1.镜像下载 如未拥有系统镜像文件的伙伴可通过前往下面的连接进行下载&#xff0c;下载完成后需将其刻录至U盘中。 PS&#xff1a;该U盘应为空盘&#xff0c;刻录文件会导该盘格式化&#xff0c;下载文件选择dvd1.iso完整包&#xff0c;适用于本地安装。 下载地址&#xff1…

恋爱相亲交友系统源码原生源码可二次开发APP 小程序 H5,web全适配

直播互动&#xff1a;平台设有专门的直播间&#xff0c;允许房间主人与其他异性用户通过视频连线的方式进行一对一互动。语音视频交流&#xff1a;异性用户可以发起语音或视频通话&#xff0c;以增进了解和交流。群组聊天&#xff1a;用户能够创建群聊&#xff0c;邀请自己关注…

【云计算】什么是云计算服务|为什么出现了云计算|云计算的服务模式

文章目录 什么是云计算服务本地部署VS云计算SaaS PaaS IaaS公有云、私有云、混合云为什么优先发展云计算服务的厂商是亚马逊、阿里巴巴等公司 什么是云计算服务 根据不同的目标用户&#xff0c;云计算服务&#xff08;Cloud Computing Services&#xff09;分为两种&#xff1…

探索动销方案创新路径,开启企业增长新引擎

在当今竞争激烈的市场中&#xff0c;动销方案的重要性不言而喻。然而&#xff0c;传统动销手段已难以应对多变的市场环境&#xff0c;企业急需探索创新路径。 当前动销方案面临哪些挑战呢&#xff1f; 首先&#xff0c;消费者需求越发多样化&#xff0c;他们追求个性化和多元化…

如何修复软件中的BUG

笔者上一篇博文《如何开发出一款优秀的软件》主要讲了如何开发一款优秀的软件及相应的必要条件。但对一个已上线&#xff0c;已经成型的产品&#xff0c;该如何解决存在的bug呢&#xff1f;这是本文要阐述的内容。 在这里&#xff0c;首先说一下bug的种类及bug严重程度分类&…

QT: Unable to create a debugging engine.

1.问题场景&#xff1a; 第一次安装QT&#xff0c;没有配置debug功能 打开控制面板》程序》找到Kit 重启电脑即可 2.问题场景&#xff1a; qt原本一直好好的&#xff0c;突然有天打开运行调试版本&#xff0c;提示Unable to create a debugging engine.错误。这个是指无法创…