1.useControl页面在使用的时候,是没有showDialog功能的。
2.列表在潘顿是否为空的时候可以直接判断列表元素的数量是否为零。
3.foreach循环遍历的时候,要模拟这个循环完整的运行过程,在不容易出错,否则容易出现逻辑错误。
4.在实例一个对象时,要确认是否有值:在实例化后,也要确定是新复制一个实例,还是调用的原有实例。以此确定使用的属性是否存在或有值。如:
new ChartSet(this, gate).ShowDialog();//仅仅是new了一个实例
又或者:
public ObservableCollection<Alarm> BoardList_ip { get; set; }
private void CopyData(){
var boardlist = new Alarm { };
boardlist.BoardCheck = false;
boardlist.BoardName = board.Entity.IP;
BoardList_ip.Add(boardlist);
}
5.在值的传递与接收时,一定要确认时谁传出的值,又是谁接受的值,中间有没有通过其他的字段进行运算。如:
private void gate_setting_Click(object sender, RoutedEventArgs e)
{
var gate = new GateData();
if (new ChartSet(this, gate).ShowDialog()==true)
{
chart.SetGate(new ChartControls.Gate() { X1 = gate.X1, X2 = gate.X2, Y = gate.Y }, gate.Index);
if (CurrentBoard!=null)
{
CurrentBoard.Gates[gate.Index].Start = gate.X1;
CurrentBoard.Gates[gate.Index].Width = gate.X2 - gate.X1;
CurrentBoard.Gates[gate.Index].Height = gate.X1;
}
}
}
6.如果出现空指针的错误,一般情况下不是没有实例或对象,就是没有值存在。
7.在做页面跳转的时候尽可能使用view分类,页面控件才能够跳转。
8.在做列表显示的时候,要注意格式,是可以解决双击才能出发时间的问题的
<DataGrid x:Name="AlarmChart" Grid.Row="2" HorizontalAlignment="Center" HorizontalContentAlignment="Center" BorderBrush="Gray" BorderThickness="1" SelectedIndex="{Binding AlarmSelectedIndex,Mode=TwoWay}" x:FieldModifier="public" GridLinesVisibility="None" AutoGenerateColumns="False" CanUserDeleteRows="False" CanUserAddRows="False" IsReadOnly="False" ItemsSource="{Binding AlarmList,Mode=TwoWay}" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="报警源">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Width="60" SelectedIndex="{Binding AlarmIndex,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
<ComboBoxItem Content="I"/>
<ComboBoxItem Content="A"/>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="激活报警">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox Width="80" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" IsChecked="{Binding AlarmChecked,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="权重系数">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Width="100" Text="{Binding AlarmICoe,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="周期">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Width="80" Text="{Binding AlarmDuring,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="输出位">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Width="90" SelectedIndex="{Binding AlarmBitMask,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
<ComboBoxItem Content="第0位输出"/>
<ComboBoxItem Content="第1位输出"/>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="报警模式">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Width="100" SelectedIndex="{Binding AlarmMode,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
<ComboBoxItem Content="渡越时间超上限"/>
<ComboBoxItem Content="渡越时间超下限"/>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="输出节拍">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Width="80" SelectedIndex="{Binding AlarmRhythm,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
<ComboBoxItem Content="报警保持输出"/>
<ComboBoxItem Content="定时输出"/>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="报警逻辑">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Width="80" SelectedIndex="{Binding AlarmLog,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
<ComboBoxItem Content="冲过闸门输出报警"/>
<ComboBoxItem Content="关闭报警"/>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="报警关联">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Width="80" SelectedIndex="{Binding AlarmTmSpac,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
<ComboBoxItem Content="自由输出"/>
<ComboBoxItem Content="关联时间输出"/>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
且在作数据Binding时,可以新建一个类做数据中转。
9.在做数据处理的时候,一定要注意数值的传递方向。是单向的还是双向的。一般都是单向的。特别是用等号赋值或者一些对值进行操作的结果都是单项的值。结果不会影响之前的值。例如A=B,B=C+D,A不等于C+D。若是需要用到c+d的值通过A是调用不到的。所以一定要注意值得传递方向。
10.页面弹窗有时候是需要传递出来数据的。但是在弹窗里操作的值,是对原始数据的复制以后进行操作。无论结果怎么样。都不会影响到原始数据。这时候可以在原来的基础上,在弹窗里增加一个属性。对属性进行操作。
public string Result { get; set; }
var input = new TextBoxInput();//定义弹窗弹出
if (input.ShowDialog() == true)
{
config.CustomName = input.Result;
}
//Console.WriteLine(input.Result);
//config.CustomName = "ss";
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
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.Shapes;
using UTNet.Models;
namespace UTNet.Views
{
/// <summary>
/// TextBoxInput.xaml 的交互逻辑
/// </summary>
public partial class TextBoxInput : Window
{
public TextBoxInput()
{
InitializeComponent();
this.DataContext = this;
this.KeyDown += InputDialog_KeyDown;
}
public string Result { get; set; }
private void InputDialog_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
if (input_tb.Text.Trim().Equals(""))
{
MessageBox.Show("请输入有效内容!", "输入有误");
}
else
{
this.DialogResult = true;
this.Result = input_tb.Text.Trim();
this.Close();
}
}
}
public string Note
{
get { return input_tb.Text; }
set { }
}
}
}
11.在数据定义的时候,要分清楚数据是否是标签还是实例。标签的话是否被赋值了。
private Board board;
这就是一个标签,在使用的时候会出现空指针的情况。
public AScan( Board board)
{
this.board = board;
}
这就是在给他赋值。只用赋值后才能使用。
12。类与对象要分清楚。静态与动态要分清楚。静态的就是一个实例。动态的就是一个引用值。就像是建筑图纸与建筑之间的关系。而类与对象就是一批水果就是类。其中苹果,李子就是一个对象。至于值参数与引用参数:在把变量作用于实参之前,变量必须赋值(除非是out参数)。对于引用类型,变量可以被设置为一个实际的引用或null。使用值参数,通过将实参的值复制到形参的方式,把数据传递到方法。使用引用参数时,必须在方法的申明和调用中都使用关键字ref修饰符。实参必须是变量,在用作实参前必须被赋值。如果是引用类型的变量,可以赋值为一个引用或者null值。