上篇介绍了创建WPF项目以及修改Button显示文本的方法 :创建WPF项目,这篇继续分享Button按钮的使用
目录
一 简单按钮的使用
WPF 窗口视图xmal 中绑定Button事件,双击按钮会在后台代码中自动生成按钮的Click事件:
<Button Content="Simple Button" HorizontalAlignment="Left" Margin="508,82,0,0" VerticalAlignment="Top" Width="109" Name="MySimpleButton" Click="SimpleButton"/>
/// <summary>
/// 简单按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SimpleButton(object sender, RoutedEventArgs e)
{
MessageBox.Show("简单按钮使用");
}
二 代码中动态注册
简单按钮处理通过添加Click事件可以达到需求,而如果想要在代码中动态注册也是可以的:
设置Button组件的Name属性,设置BorderBrush,FontWeight等属性可改变 Button 控件文本格式。
<Button Content="Simple Button" Background ="BurlyWood" BorderBrush="Red" Foreground="Blue" FontWeight= "DemiBold" Margin="508,82,0,0" VerticalAlignment="Top" Width="109" Name="MySimpleButton" Click="SimpleButton" />
后台代码中通过当前组件的名称Name属性,对该组件进行事件注册。 我们通过MessageBox弹窗来检测按钮事件是否正常触发。
public MainWindow()
{
InitializeComponent();
Init();
}
void Init()
{
MyAutoRegistButton.Click += new RoutedEventHandler(ButtonRegistrationEvent);
}
/// <summary>
/// 代码注册事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonRegistrationEvent(object sender, RoutedEventArgs e)
{
MessageBox.Show("代码注册事件 按钮使用");
}
三 动态生成按钮
如果想动态生成按钮,也是可以的。添加Window_Loaded,在窗口加载完成时调用Window_Loaded,在后台控制添加函数实现按钮的动态生成。
实例化一个按钮组件,可以设置该组件的各种属性,注册按钮事件,然后将新生成的组件添加到所需Canvas中。
/// <summary>
/// 生成按钮:窗体加载时完成生成按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Button createBtn = new Button
{
Name = "CreateButton",
Content = "CreateButton",
Height = 40,
Width = 80,
HorizontalAlignment = HorizontalAlignment.Left,
Margin = new Thickness(20, 20, 20, 20),
VerticalAlignment = VerticalAlignment.Top,
Visibility = Visibility.Visible,
};
createBtn.Click += new RoutedEventHandler(CreateButtonOnClick);
MyCanvas.Children.Add(createBtn);
}
三 带图片的按钮
添加图片的按钮在日常中是常见的需求,随便找一个icon图标放置在项目中路径:ImgSource/icon1.png
在button组件的属性中设置Source属性,路径设置为项目中放置图标的路径,格式化属性。
<Button Click="IconClick" Margin="574,24,25.333,275.667">
<Button.Template>
<ControlTemplate>
<Grid>
<Image Margin="2" Source="ImgSource/icon1.png" Height="60" Width="60"/>
<TextBlock Foreground="Blue" Background="BlanchedAlmond" FontStyle="Italic" HorizontalAlignment ="Center" VerticalAlignment="Bottom">测试按钮</TextBlock>
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
四 WPF中使用winform Button组件
WPF从winform中衍生出来,并且加入了很多新的思想。如果想在WPF使用winfrom的组件改如何使用呢,接下来使用最简单的Button组件来展示
在WPF中引用Winform控件:
1 添加引用:首先需要添加两个DLL的引用:WindowsFormsIntegration.dll,System.Windows.Forms.dll。VS2019版本如果已经按照了.NETFramework 4.7.2,默认存放的位置如下:
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2\System.Windows.Forms.dll
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2\WindowsFormsIntegration.dll
2 WPF窗口视图 Xaml 中添加winform引用
xmlns:forms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
3 在WPF中使用winform组件需要加上WinForm控件的宿主容器 "WindowsFormsHost",用来设置属性来调整大小和布局。而设置组件属性需加入命名前缀
<StackPanel Margin="462,150,0,0">
<WindowsFormsHost Margin="120,30,10,0" Height="111" Background="CadetBlue">
<forms:Button x:Name="WindowsFormsButton" Text="按钮" Click="WindowsFormsButtonClick"/>
</WindowsFormsHost>
</StackPanel>
五 RadioButton使用
RadioButton组件分为选中和非选中状态
如果界面上出现多个Radiobutton组件且所属同一个Grid里面,系统会认为所有的Radiobutton中GroupName相同的是同一组,同组中只会同时存在一个单选框。
<Canvas Margin="0,190,430,0">
<RadioButton Name="RadBtn1" Margin="50,0,0,0" GroupName="Group1" Background="Yellow" Foreground="Brown" Click="RadBtnOnChecked">牛奶</RadioButton>
<RadioButton Name="RadBtn2" Margin="50,50,0,0" GroupName="Group1" Background="Yellow" Foreground="Blue">啤酒</RadioButton>
<RadioButton Name="RadBtn3" Margin="50,100,0,0" GroupName="Group1" Background="Yellow" Foreground="Orange">可乐</RadioButton>
<RadioButton Name="RadBtn4" Margin="50,150,0,0" GroupName="Group2" Background="Yellow" Foreground="Green">米饭</RadioButton>
<RadioButton Name="RadBtn5" Margin="50,200,0,0" GroupName="Group2" Background="Yellow" Foreground="Purple">面条</RadioButton>
</Canvas>
如图所示,将RadioButton按钮分为两组,按钮触发状态也是两组,根据所需设置Group数量。
同样按钮点击事件和Button组件类似。
private void RadBtnOnChecked(object sender, RoutedEventArgs e)
{
//RadBtn1.Foreground = Brushes.Blue;
//RadBtn1.Background = Brushes.Yellow;
MessageBox.Show(" RadBtnOnChecked 按钮点击");
}
六 代码整理
前后台完整代码放在这里,方便大家观看
<Window x:Class="ButtonWPF.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:ButtonWPF"
xmlns:forms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">
<Grid>
<Canvas Name="MyCanvas" Margin="0,57,0,0">
<Button Content="AutoRegistButton" HorizontalAlignment="Left" VerticalAlignment="Top" Width="131" Name="MyAutoRegistButton" Canvas.Left="377" Canvas.Top="-20" Height="30"/>
<Button Content="Simple Button" Background ="BlanchedAlmond" BorderBrush="Red" Foreground="Blue" FontWeight= "DemiBold" VerticalAlignment="Top" Width="131" Name="MySimpleButton" Click="SimpleButton" Canvas.Left="377" Canvas.Top="44" Height="30" />
</Canvas>
<Canvas Margin="0,190,430,0">
<RadioButton Name="RadBtn1" Margin="50,0,0,0" GroupName="Group1" Background="Yellow" Foreground="Brown" Click="RadBtnOnChecked">牛奶</RadioButton>
<RadioButton Name="RadBtn2" Margin="50,50,0,0" GroupName="Group1" Background="Yellow" Foreground="Blue">啤酒</RadioButton>
<RadioButton Name="RadBtn3" Margin="50,100,0,0" GroupName="Group1" Background="Yellow" Foreground="Orange">可乐</RadioButton>
<RadioButton Name="RadBtn4" Margin="50,150,0,0" GroupName="Group2" Background="Yellow" Foreground="Green">米饭</RadioButton>
<RadioButton Name="RadBtn5" Margin="50,200,0,0" GroupName="Group2" Background="Yellow" Foreground="Purple">面条</RadioButton>
</Canvas>
<Button Click="IconClick" Margin="574,24,25.333,275.667">
<Button.Template>
<ControlTemplate>
<Grid>
<Image Margin="2" Source="ImgSource/icon1.png" Height="60" Width="60"/>
<TextBlock Foreground="Blue" Background="BlanchedAlmond" FontStyle="Italic" HorizontalAlignment ="Center" VerticalAlignment="Bottom">测试按钮</TextBlock>
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
<StackPanel Margin="462,150,0,0">
<WindowsFormsHost Margin="120,30,10,0" Height="111" Background="BlanchedAlmond">
<forms:Button x:Name="WindowsFormsButton" Text="WindowsButton" Click="WindowsFormsButtonClick"/>
</WindowsFormsHost>
</StackPanel>
</Grid>
</Window>
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 WindowsForms = System.Windows.Forms;
namespace ButtonWPF
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Init();
}
void Init()
{
MyAutoRegistButton.Click += new RoutedEventHandler(ButtonRegistrationEvent);
}
/// <summary>
/// 生成按钮:窗体加载时完成生成按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Button createBtn = new Button
{
Name = "CreateButton",
Content = "CreateButton",
Height = 40,
Width = 80,
HorizontalAlignment = HorizontalAlignment.Left,
Margin = new Thickness(20, 20, 20, 20),
VerticalAlignment = VerticalAlignment.Top,
Visibility = Visibility.Visible,
};
createBtn.Click += new RoutedEventHandler(CreateButtonOnClick);
MyCanvas.Children.Add(createBtn);
}
private void CreateButtonOnClick(object sender, RoutedEventArgs e)
{
MessageBox.Show("CreateButtonOnClick 按钮点击");
}
/// <summary>
/// 代码注册事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonRegistrationEvent (object sender, RoutedEventArgs e)
{
MessageBox.Show("代码注册事件 按钮使用");
}
/// <summary>
/// 简单按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SimpleButton(object sender, RoutedEventArgs e)
{
MessageBox.Show("简单按钮使用");
}
/// <summary>
/// 带图标的按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void IconClick(object sender, RoutedEventArgs e)
{
MessageBox.Show("图标使用");
}
/// <summary>
/// 引用winform按钮组件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void WindowsFormsButtonClick(object sender, EventArgs e)
{
MessageBox.Show(" WindowsForm 按钮点击");
}
private void RadBtnOnChecked(object sender, RoutedEventArgs e)
{
//RadBtn1.Foreground = Brushes.Blue;
//RadBtn1.Background = Brushes.Yellow;
MessageBox.Show(" RadBtnOnChecked 按钮点击");
}
}
}
项目配置如图:
结语
将WPF中按钮相关的简单使用整理了一下,希望对大家有所帮助。
主要组件的简单使用做介绍,后续有机会继续完善和介绍复杂状态下的使用。
按钮配色以及布局就比较随意了,程序猿的审美,求轻喷。
这里把相关的代码链接放在这里:WPF学习整理