我们在.Net Compact Framework和Windows Mobile中广泛开展工作。我已经看到很多关于ASP.Net应用程序或其他.Net桌面应用程序开发细节的问题,但没有特定的CF.
其他任何移动开发人员都可以分享一些事情来开始做,停止做,并避免在Compact Framework中进行开发时做什么?
答案 0 :(得分:120)
不确定
已添加5/25/10
已添加7/27/10
已添加11/22/11
我只是添加到列表中,因为它们发生在我身上......
答案 1 :(得分:13)
OpenNETCF是一个很好的资源。
在使用.NET Compact Framework进行开发时,他们的Smart Device Framework是必不可少的,因为缺少许多Full框架功能[我认为有人曾经说过.NET Compact Framework是NotImplementedException的包装器! ]
答案 2 :(得分:11)
这不是仅 Compact Framework设备所特有的,但是由于在移动平台上开发资源限制而在开发它们时,它会变得更加丑陋。
最近,我发现了一篇很棒的帖子,作为管理内存泄漏的一部分,帮助我在一个移动应用程序中bug when setting the DataGrid.DataSource找出了我不知道的泄漏。
绑定DataGrid时,不应直接使用以下内容:
dgDataGrid.DataSource = dsDataSet;
因为这会在每次没有正确处理时创建一个新的CurrencyManager。相反,您希望首先将DataGrid绑定到BindingSource,以避免资源泄漏。
bsData.DataSource = dsDataSet;
dgDataGrid.DataSource = bsData;
谁知道?斯科特朗廷在another post做了。谢谢斯科特!
答案 3 :(得分:7)
如果您必须支持多种屏幕尺寸/分辨率,表单继承是一种很好的方法。基本上,您设计的表格适合标准的320x240屏幕。要支持不同的屏幕大小,您只需添加一个新表单,从您的自定义表单(而不仅仅是表单)继承,然后根据需要重新排列控件。
另一个有用的技巧是以一种允许您将父表单的标题临时设置为“”的方式包装ShowDialog调用 - 这会使应用程序中的所有打开表单不会显示在正在运行的程序列表中。增强包装器的另一种方法是使用父窗口的句柄PInvoke SetForegroundWindow。这可以确保父母在孩子关闭后总是重新出现;没有这个调用,其他窗口可以插入父窗体上方的z-stack中。
注意SD卡上的加密。 SqlCE将完全停止工作。 Oracle Lite在加密下的行为更加险恶,因为它的部分功能和部分功能都不起作用。
避免使用SqlCE RDA并合并复制。如果它们可靠地工作,这些将是很棒的工具,但是在复制期间可能意外地丢弃网络连接的情况下(在WM世界中很常见)。这一点我很难与生产应用程序。我们处理的MS支持技术最终被迫承认它不能100%工作。实际引用:“只是继续尝试复制 - 它们最终会正确合并”。
答案 4 :(得分:7)
大多数不同寻常的东西需要通过P / Invoke直接调用Windows API。 我发现http://www.pinvoke.net/是Win32和Windows CE上P / Invoke的绝佳资源。
答案 5 :(得分:7)
正如您所看到的那样,如果您对在Visual Studio 2010中没有Compact Framework支持感到不满,请转到here并投票支持将其添加进去。(并传播该词)
MS或多或少放弃了Connect中的现有功能请求。有关此功能,请转到新的User Voice site to vote。
答案 6 :(得分:4)
答案 7 :(得分:4)
使用Compact Framework和SqlCe,可能会出现很多性能,内存泄漏和线程同步问题。
遵守最小化Compact Framework的规则 - SqlCe令人头疼。
答案 8 :(得分:3)
OpenNet CF值得研究 - 即使免费版也有一些有用的库 - 例如FTP,datagrid附加功能等;这非常有用,因为CF缺少很多.net框架功能。
答案 9 :(得分:3)
单元测试(TDD)可以在.net cf.但是有一些问题。
您将使用MSTest。不是NUnit,MBUnit,XUnit.net等MSTest。
您将需要Visual Studio Professional(尽我所知)。最简单的入门方法是右键单击要测试的方法,然后选择“创建单元测试”。这为您设置了测试项目。只创建一个测试项目。它不喜欢有多个。只需执行此操作即可创建项目并为您设置所有依赖项。然后创建自己的测试类。
模拟对象可能是个问题。 RhinoMocks,Moq和TypeMock都依赖于.net cf中没有的东西。 Pex有一个项目叫做Stubs,我还在调查。 Pex是Microsoft Research的一个项目。您将最终创建自定义假对象。
测试在设备模拟器上运行。这意味着必须部署它们。如果您在第一次启动测试运行器时遇到奇怪的错误,那么您可能还没有在设备模拟器上安装.net 3.5。首先部署项目,然后再次运行测试。
在非测试方面: 你确实得到LINQ to Objects和LINQ to XML。两者都是天赐之物。 您可以通过WCF与服务器通信,但是您没有获得所有端点。
答案 10 :(得分:2)
使用DataGrid时,您可以使用以下代码posted on Chris Craft's blog通过列标题对其内容进行排序:
using System.Windows.Forms;
using System.Data;
public static void SortDataGrid(object sender, System.Windows.Forms.MouseEventArgs e)
{
DataGrid.HitTestInfo hitTest;
DataTable dataTable;
DataView dataView;
string columnName;
DataGrid dataGrid;
// Use only left mouse button clicks.
if (e.Button == MouseButtons.Left)
{
// Set dataGrid equal to the object that called this event handler.
dataGrid = (DataGrid)sender;
// Perform a hit test to determine where the mousedown event occured.
hitTest = dataGrid.HitTest(e.X, e.Y);
// If the MouseDown event occured on a column header,
// then perform the sorting operation.
if (hitTest.Type == DataGrid.HitTestType.ColumnHeader)
{
// Get the DataTable associated with this datagrid.
dataTable = (DataTable)dataGrid.DataSource;
// Get the DataView associated with the DataTable.
dataView = dataTable.DefaultView;
// Get the name of the column that was clicked.
if(dataGrid.TableStyles.Count != 0)
columnName = dataGrid.TableStyles[0].GridColumnStyles[hitTest.Column].MappingName;
else
columnName = dataTable.Columns[hitTest.Column].ColumnName;
// If the sort property of the DataView is already the current
// column name, sort that column in descending order.
// Otherwise, sort on the column name.
if (dataView.Sort == columnName)
dataView.Sort = columnName + " DESC";
else
dataView.Sort = columnName;
}
}
}
private void dgDataGrid_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
if(dgDataGrid.VisibleRowCount == 0) return;
SortDataGrid(sender, e);
dgDataGrid.Select(dgDataGrid.CurrentRowIndex);
}
答案 11 :(得分:2)
您将在.net cf.中遇到很多错误和限制。你将不得不修补它们。它很丑,但你别无选择。
您最终会编写很多自定义控件。由于框架中的大多数控件不支持客户端通常请求的功能。因此,为您从一开始就使用的每个控件创建自定义控件是一个很好的做法。即使你开始时可能没有任何东西。您可以稍后添加自定义逻辑。无需修改大量现有代码。
如果您需要验证,可以使用.net validation framework
这就是我现在能想到的一切。
答案 12 :(得分:1)
使用OutlookSession执行任何操作时,始终
答案 13 :(得分:1)
使用Windows Mobile时,如果您不希望全屏显示表单,则需要将 FormBorderStyle 设置为无。如果你不这样做,你会花几个小时拉出你的头发,想知道为什么它会自动调整到全屏大小(实际上是Windows Mobile的功能)