WPF: 数据绑定(Halcon)

本实例完全是翻译Halcon 13.0中的实例代码BindingWPF(WPF新手)。

1)构建编程环境

    1.1)参照实例代码,在VS2017 Community中选择WPF窗体模式(WPF应用(.Net Framework),同时选择框架.Net Framework 3.5),选择代码保存的位置,直接生成即可。

    1.2)这一步,可以选编译试试,选择Run,看看代码是否能正常生成,运行。

    1.3)添加引用,我们需要选择Halcondotnet 3.5版本的库。同时打开文件MainWindow.xaml添加引用

xmlns:HalconDotnet="clr-namespace:HalconDotNet;assembly=halcondotnet"
xmlns:local="clr-namespace:MyBinding1"

上面MyBinding1使我们工程的名字。

    1.4)更改窗体大小:

Title="MainWindow" Height="800" Width="600" MinWidth="450" MinHeight="400">

再次测试,如同1.2)步,看是否能正常运行。

2)准备数据转换类

    在运行源代码时候,这个转换类会有Exception显示,原因是解析的时候出错,把

string[] ImagePartArg = value.ToString().Split(';');
换成
string[] ImagePartArg = value.ToString().Split(',');

即可。最终完整代码为:

public class ImagePartDecimalPlaceConverter : IValueConverter
{
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            try
            {
                //seems just return value is also ok
                string[] ImagePartArg = value.ToString().Split(',');
                Console.WriteLine(value.ToString());

                string shortForm = ImagePartArg[0] + ','
                                   + ImagePartArg[1] + ','
                                   + ImagePartArg[2] + ','
                                   + ImagePartArg[3];
                return shortForm;
            }
            catch (Exception)
            {
                // In error case, just return the input value, do nothing
                return value.ToString();
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            // Nothing to do in set mode
            return value.ToString();
        }
 }

IValueConverter必须要实现Convert和ConvertBack两个函数。

3)准备Resource

    打开App.xaml文件,把这个转换类作为Resource作为App的资源,添加以下代码:


        

我原来想把这部分同源代码一样放入MainWindow.xaml中作为的一部分,后面在调试时发现报错,就改到放到App.xaml文件中。对命名空间这块可能还是没整明白。

4)设置Grid布局部分

    整体分为两行一列,第一行放按钮及相关Label等,第二行放置图像及两个Slider(竖直和水平各一个):


     
     


     

以下为第一行的子网格(又分为6行5列):


            
                
                
                
                
                
                
            
            
                
                
                
                
                
              

接下来是第二行内容,分为两行两列:


            
                
                
            
            
                
                
            

至此,网格设计完成(都是直接拷贝的)。这些网格只是方便后面对其它控件布置。运行代码,界面上没看到什么特别的。

5)在Grid(0,0)部分添加4个按钮,用于加载4张不同的图像:

以第一个按钮为例,按钮文本=Fabik,接下来是对其格式,放置在子网格的(0,1)处,对应的事件Button_Click_Fabrik。

打开MainWindow.xaml.cs文件,添加4个按钮的处理事件:

private void Button_Click_Fabrik(object sender, RoutedEventArgs e)
{
   hwindow.HDisplayCurrentObject = new HImage("fabrik");
}

private void Button_Click_Patras(object sender, RoutedEventArgs e)
{
   hwindow.HDisplayCurrentObject = new HImage("patras");
}

private void Button_Click_Atoms(object sender, RoutedEventArgs e)
{
   hwindow.HDisplayCurrentObject = new HImage("atoms");
}

private void Button_Click_PCBLayout(object sender, RoutedEventArgs e)
{
   hwindow.HDisplayCurrentObject = new HImage("pcb_layout");
   HRegion region = ((HImage)hwindow.HDisplayCurrentObject).Threshold(0, 50.0);
   HRegion connected_region = region.Connection();
   hwindow.HDisplayCurrentObject = connected_region;
}
4个按钮分别加载4张不同的图像,其中PCBLayout部分,加载图像后二值化,找边并显示边界图像。

VS会提示很多错误,主要由于Halcon引起的,在文件开始部分先添加Halcon的引用:

using HalconDotNet;

其它会显示hwindow无法识别,这是由于我们还没有把窗体hwindow添加进去,这一步暂时放一放。

6)接下来添加Label,注意它们在Grid中的位置:

7)添加其它相关控件:






其中,WindowSize显示hwindow的大小;

ImagePart显示图像大小,它与HImagePart绑定,当这个属性改变时这个值也跟着改变;

HMoveContent设置图像位置是否与鼠标移动相关联,前提是鼠标需要放到图像上;

HKeepAspectRatio设置图像开始显示时是否完全填充图像框;

HZoomFactor图像缩放,并把缩放的比例大小放到HZoomFactorValue文本当中。

8)添加窗体:

8.1)进入窗体设计界面,点击左上角的‘工具箱’;

8.2)右键点击’常用WPF控件’,选择’选择项...’;

8.3)进入到WPF组件界面,点击’浏览...’找到HalconDotnet (3.5版本),加载;

8.4)这时候在工具箱中能看到HSmartWindowControlWPF及HWindowControlWPF,选择前一个并拖到主界面下边中间位置,实际就是Grid(1,1)位置,设置控件名称为hwindow。第5)步报错就是由于它引起的,现在没有了。

9)添加窗体及两个Slider:


            


上面窗体的宽度与水平Slider的相关联,高度与竖直Slider相关联,同时在窗体加载时,同时加载图像“fabrik”,并计算WindowSize和ImagePart两个参数。

10)运行代码,改变两个Slider的位置,会看到图像大小也跟着改变。

WPF: 数据绑定(Halcon)_第1张图片 WPF: 数据绑定(Halcon)_第2张图片

你可能感兴趣的:(WPF,WPF)