【现代程序设计】【期末作业】【homework-09】
作业要求说明:
http://www.cnblogs.com/xinz/p/3441537.html
我在做一个什么样的应用:
展示如何逐步求解一个加权矩阵的
- 最大子矩阵
- 最大子联通图
下面是软件的截图
包含的基本功能:
- 从文件读入矩阵随机生成矩阵
- 本软件将保存最近使用的3个文件(若包含当前正在使用的文件,则为4个)
- 随机生成矩阵
- 可设置矩阵的大小,不超过10*10
- 超过10*10将导致anymaxsum步骤过多,而没有什么教学意义了。
- 播放
- 自动
- 随时调整播放间隔(播放中亦可)
- 手动
- 回退和下一步
- 重置
- 选择播放类型
结果展示:(包含一个矩阵和两个文本框)
- 矩阵:用于显示详细步骤和状态(详细见软件)
- 最大值(文本框):显示当前最大值
- 当前值(文本框):显示当前选定值
应用设计语言和平台:
- 语言:C#+XAML
- 运行平台:.Net 4.0+ and 浏览器(IE9+)
什么工作占用了我比较大的时间?
GUI的设计
思考到底怎样的设计才能让初学者理解DP动态规划执行的过程和原理,而不是看着动画一闪而过,完全不明白整个过程是在做什么。
- 例子需简单,即矩阵不能包含过多的元素,4*4,5*5,6*6是可接受的值。
- 执行过程需可控,用户可以选择手动或者自动模式,自动模式下,播放速度可以调节。
- 每一个中间步骤需要有对应的解释说明,解释还需要贴合人们的思维模式,比如 a.红色代表错误 b.绿色代表可行。
- 用户大多数时候都在看算法执行的过程,因此初始值相关的GUI控件应该只占用小部分空间
- 【停止】,【播放】,【上一步】等等控件应该被设计的比较大,因为它们会被访问的更频繁。
下面是该软件的详细设计时遇到几个问题:
安全问题,浏览器文件访问权限
浏览器端的应用均运行于沙盒之中,所以浏览器无法直接使用使用文件选取器
解决办法
提升应用的权限,在属性中更改
如何将二维数组绑定到控件 DataGrid?
代码DataGrid
1 <DataGrid x:Name="dataGrid" ItemsSource="{Binding CollectionSource}" SelectionUnit="CellOrRowHeader" IsReadOnly="True" MaxColumnWidth="100" MinColumnWidth="100" AutoGenerateColumns="True" CanUserResizeRows="False" CanUserSortColumns="False" CanUserReorderColumns="False" LoadingRow="dataGrid_LoadingRow" HorizontalAlignment="Center" VerticalAlignment="Center" AutoGeneratedColumns="dataGrid_AutoGeneratedColumns" AutoGeneratingColumn="dataGrid_AutoGeneratingColumn" Margin="0,0,0,30" FontSize="20" FontFamily="Segoe UI"> 2 <DataGrid.ColumnHeaderStyle> 3 <Style TargetType="DataGridColumnHeader"> 4 <Setter Property="HorizontalContentAlignment" Value="Center"/> 5 <Setter Property="Background" Value="AliceBlue" /> 6 <Setter Property="Foreground" Value="Black"/> 7 <Setter Property="FontSize" Value="20" /> 8 </Style> 9 </DataGrid.ColumnHeaderStyle> 10 11 </DataGrid>
PageSource
<Page.Resources> <DataTemplate x:Key="CellTemplate"> <TextBlock Background="{Binding Back}" Text="{Binding Value}" TextAlignment="Center" Foreground="White"/> </DataTemplate> </Page.Resources>
首先,在PageSource 里面申明了一个CellTemplate,将DataGrid 每一个Cell 设置为 一个TextBlock
后台定义了一个类 item,包含元素 Back,Value
分别对应该TextBlock的Background和Text两个属性
定义了 一个 继承于 ObservableCollection<item> items 收集DataGrid每一行的数据
并定义了一个 ObservableCollection<items> CollectionSource,收集DataGrid所有行的数据
再在DataGrid代码里将 ItemsSource绑定到CollectionSource: [ItemsSource="{Binding CollectionSource}"]
后台算法
因在第三次作业中已经完成了这部分工作
所以这次作业,我只是在maxsum类中加入了两个属性:
并设置了访问器
在实体化maxsum类之后,便可以直接获取数据
1 /// <summary> 2 /// 结果存储于下面两个list 3 /// result_maxsum 矩阵 4 /// result_any_maxsum 任意 5 /// </summary> 6 public List<step_detail> result_maxsum { get; set; } 7 public List<step_detail> result_any_maxsum { get; set; }
几个测试用例