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;
namespace Plugins.Vpp.Views
{
///
/// UCDispVpp.xaml 的交互逻辑
///
public partial class UCDispVpp : UserControl
{
public UCDispVpp()
{
InitializeComponent();
}
#region 属性
int[] _RowColNumber = new int[2];
internal object obj = new object();
public int[] RowColNumber
{
get { return _RowColNumber; }
set
{
lock (obj)
{
AddHalconCv(value[0], value[1]);
_RowColNumber = value;
}
}
}
private int DoubleVppNumber = -1;
private VppWindow DoubleWindow = null;
public List vppWindow = new List();
private static UCDispVpp _instance = new UCDispVpp();
public static UCDispVpp Instance
{
get { return _instance; }
}
#endregion
#region 方法
///
/// 添加Vpp窗体控件:
/// - 按 GetColRow 最优行列布局,但只创建 num 个窗体(不补空白格);
/// - 数量除不尽时,最后一个窗体直接跨列填满本行剩余位置。
///
/// 画面数量
/// 排列方式:1=水平方向优先,2=垂直方向优先
public void AddHalconCv(int num, int array)
{
try
{
UCDispVpp.Instance.vppWindow.Clear();
Task.Delay(100).Wait();
UCDispVpp.Instance.GetColRow(num, out int row, out int col);
if (array == 2) (row, col) = (col, row); // 垂直方向优先:交换行列倾向
foreach (var item in UCDispVpp.Instance.vppWindow)
{
Application.Current.Dispatcher.Invoke(() =>
{
item.MouseDouble -= UCDispVpp_MouseDoubleClick;
});
}
if (DoubleVppNumber >=0&& DoubleWindow!=null)
Application.Current.Dispatcher.Invoke(() => UCDispVppChildren_MouseDoubleClick(DoubleWindow, DoubleVppNumber));
Application.Current.Dispatcher.Invoke(() => UCDispVpp.Instance.VppGrid.Children.Clear());
Application.Current.Dispatcher.Invoke(new Action(() =>
{
// 重建等分行列定义
var grid = UCDispVpp.Instance.VppGrid;
grid.RowDefinitions.Clear();
grid.ColumnDefinitions.Clear();
for (int r = 0; r < row; r++)
grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
for (int c = 0; c < col; c++)
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
}));
Task.Delay(100).Wait();
for (int i = 0; i < num; i++)
{
Application.Current.Dispatcher.Invoke(() =>
{
UCDispVpp.Instance.vppWindow.Add(new VppWindow(i + 1));
});
Task.Delay(100).Wait();
}
for (int i = 0; i < num; i++)
{
Application.Current.Dispatcher.Invoke(() =>
{
var w = UCDispVpp.Instance.vppWindow[i];
int r, c;
if (array == 2)
{
// 垂直优先:按列顺序填充(先填满一列再换下一列)
c = i / row;
r = i % row;
// 数量除不尽时:最后一个窗体跨行填满本列剩余位置(垂直合页)
if (i == num - 1 && row - r > 1)
Grid.SetRowSpan(w, row - r);
}
else
{
// 水平优先:按行顺序填充(先填满一行再换下一行)
r = i / col;
c = i % col;
// 数量除不尽时:最后一个窗体跨列填满本行剩余位置(水平合页,不补空白格)
if (i == num - 1 && col - c > 1)
Grid.SetColumnSpan(w, col - c);
}
Grid.SetRow(w, r);
Grid.SetColumn(w, c);
UCDispVpp.Instance.VppGrid.Children.Add(w);
w.MouseDouble += UCDispVpp_MouseDoubleClick;
});
Task.Delay(100).Wait();
}
}
catch (Exception ex)
{
throw ex;
}
}
private void UCDispVpp_MouseDoubleClick(VppWindow window, int VppNumber)
{
DoubleVppNumber = VppNumber;
DoubleWindow=window;
window.MouseDouble -= UCDispVpp_MouseDoubleClick;
VppGrid.Visibility = Visibility.Collapsed;
UCDispVpp.Instance.VppGrid.Children.Remove(window);
MaxVppGrid.Children.Clear();
MaxVppGrid.Children.Add(window);
MaxVppGrid.Visibility = Visibility.Visible;
window.SetStatusBarVisible(true); // enlarge: show coordinate status bar
window.MouseDouble += UCDispVppChildren_MouseDoubleClick;
}
private void UCDispVppChildren_MouseDoubleClick(VppWindow window, int VppNumber)
{
MaxVppGrid.Children.Clear();
MaxVppGrid.Visibility = Visibility.Collapsed;
//UCDispVpp.Instance.VppGrid.Children.Add(window);
UCDispVpp.Instance.VppGrid.Children.Insert(VppNumber - 1, window);
window.MouseDouble -= UCDispVppChildren_MouseDoubleClick;
window.MouseDouble += UCDispVpp_MouseDoubleClick;
VppGrid.Visibility = Visibility.Visible;
window.SetStatusBarVisible(false); // restore grid preview: hide coordinate status bar
DoubleVppNumber = -1;
DoubleWindow = null;
}
#endregion
#region 计算行列
///
/// 查询能被整除的最大数
///
///
///
public static int FindLargestDivisor(int target)
{
int max = target; // 初始最大数为目标数本身
List list = new List();
for (int i = 1; i < target; i++)
{
if (target % i == 0)
{
list.Add(i);
//max = i;
}
}
max = list[list.Count / 2];
return max;
}
///
/// 计算出最优行数和列数
///
/// 总计数量
/// 列数
/// 行数
public void GetColRow(int target, out int row, out int col)
{
if (target <= 2)
{
row = target > 0 ? target : 1;
col = 1;
return;
}
col = FindLargestDivisor(target);
Console.WriteLine("1:" + col);
if (col == 1)
{
col = FindLargestDivisor(target + 1);
row = (target + 1) / col;
}
else
row = target / col;
}
#endregion
}
}