WPF学习笔记
利用mainwindow窗体的开始事件和结束事件可以将一些需要初始化的值和对象进行初始化,而结束事件可以在关闭窗体的时候同时进行关闭托管线程的操作。
控件常用属性:
visiblility 控件是否隐藏/可见
isenbale 控件是否可用(button不可用的话就会变成灰色,并且点不动)
background 背景色(对应的还有前景色)
text属性
1,maxlength 可输入的最大字符数
2,textwrapping 是否自动换行的属性
>>margin 控件的位置(基于窗口边界的相对位置)
>>textbox的一个属性:isreadonly = true 这样就不能修改textbox里面的内容,可用于显示log
>>写log保存下来需要用到datetime获取当前电脑的时间;
>>部分控件的状态不止true 和 false 两个 还有可能为NULL,当直接用if去判断可能会编译错误;
bool? = NULL; //可以用bool?类型来赋值 判断;
>>给RadioButton分类分组:GroupName = “”;
>>界面上显示图片:
image控件的source属性 source = “folder1/folder2/picname.jpg”
路径文件夹之间分隔用 /
>>panel.ZIndex = "0"; 设置控件图层为底层 会被其他控件给遮住 适用于软件界面的背景图片
常用基本布局:
StackPanel
grid
//button上的内容显示为图片
<Button.Content>
<Image Source = "1.jpg"></Image>
</Button.Content>
//利用Grid布局的基本思路:
<Grid >
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<TextBlock Text="用户名:" Height="20" Width="50"></TextBlock>
<TextBox Grid.Column="1" Height="20" Width="150"></TextBox>
<TextBlock Text="密码:" Height="20" Width="50" Grid.Row=" 1"></TextBlock>
<PasswordBox Name="passwordTxt" Height="20" Width="150" Grid.Row="1" Grid.Column="1"/>
<Button Name="btnYes" Height="20" Width="50" Content="YES" Grid.Column="0" Grid.Row="2"></Button>
<Button Name="btnNo" Content="NO" Height="20" Width="50" Grid.Column="1" Grid.Row="2"></Button>
</Grid>
Grid布局和stackpanel布局可以嵌套使用,灵活多变;
//除了在XAML端布局之外,可以在windowLoad事件响应函数里面去操作Grid进行布局
private void Window_Load(object sender,RoutedEventArgs e)
{
for (int i = 0; i < 10; i++)
{
ColumnDefinition columnDef = new ColumnDefinition();
game.ColumnDefinitions.Add(columnDef);
RowDefinition rowdef = new RowDefinition();
game.RowDefinitions.Add(rowdef);
}
int number = 1;
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
Image img = new Image();
img.Source = new BitmapImage(new Uri("btn1.png",UriKind.Relative));
Grid.SetRow(img, i);
Grid.SetColumn(img,j);
game.Children.Add(img);
}
}
}
菜单栏
在主网格内新建Menu,Menu下新建多个MenuItem,单个MenuItem下仍然可以新建多个MenuItem,每个MenuItem的header属性就是子菜单的名字,接着写每个MenuItem的Click事件函数就可以了。
<Menu HorizontalAlignment="Left" Height="26" Margin="10,0,0,0" VerticalAlignment="Top" Width="772">
<MenuItem Header="111">
<MenuItem Header="222">
<MenuItem Header="333">
<MenuItem Header="444"></MenuItem>
</MenuItem>
</MenuItem>
</MenuItem>
</Menu>
至于工具栏的话 就是类似的,工具栏上可以添加所有控件(button/textbox之类的),当然也就可以给button类控件添加图片。
多窗口:
每个窗口都是一个窗口类,mainWindow在软件开启时被初始化,当mainWindow要开启其他窗口时,只需要在函数内部实例化对应的窗口类,并window.showdialog()就可以了。
两个窗口之间数据传输:
- 子窗口传数据给mainWindow:两个窗口就是两个类,其中子窗口在mainWindow里被实例化,mainWindow就能访问到子窗口里面public的对象;
- mainWindow传数据给子窗口,在实例化子窗口对象后,在showDialog()之前,给子窗口类里面的public对象赋值,即可传输数据给子窗口;
就是包含关系的两个类之间对象传递。