Каковы самый ценный.Net Compact Framework Tips, Приемы и Уклонисты Глюка? [закрытый]

У меня была эта ошибка, когда я пытался установить значения Outlets из метода подготовки к методу segue следующим образом:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destination = segue.destination as? DestinationVC{

        if let item = sender as? DataItem{
            // This line pops up the error
            destination.nameLabel.text = item.name
        }
    }
}

Тогда я узнал, что не могу установить значения выходы контроллера контроллера, потому что контроллер еще не был загружен или инициализирован.

Поэтому я решил это следующим образом:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destination = segue.destination as? DestinationVC{

        if let item = sender as? DataItem{
            // Created this method in the destination Controller to update its outlets after it's being initialized and loaded
            destination.updateView(itemData:  item)
        }
    }
}

Destination Controller:

// This variable to hold the data received to update the Label text after the VIEW DID LOAD
var name = ""

// Outlets
@IBOutlet weak var nameLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    nameLabel.text = name
}

func updateView(itemDate: ObjectModel) {
    name = itemDate.name
}

Надеюсь, этот ответ поможет кому-то там с той же проблемой, что и я заметил, что заметный ответ - отличный ресурс для понимания опций и того, как они работают, но не затронул проблему напрямую.

65
задан B. Clay Shannon 11 December 2013 в 17:21
поделиться

11 ответов

Уверенный:

  • Использование физическое устройство каждый раз, когда возможный (не эмулятор)
  • Тест с несколькими устройствами (различные поставщики, различные модели)
  • тестирование Концентрата вокруг поведений сна/пробуждения
  • При использовании модульных тестов MSTEST, никогда частные средства доступа использования
  • Избегают ActiveSync как чумы - использование отладки CoreCon, прямой
  • , Знакомится с об/мин и начинает использовать его рано
  • объекты Повторного использования, когда возможный
  • Стараются не делать большую работу в ctor Формы - от загрузки это для ленивой загрузки или в фоновом потоке
  • Формы Загрузки по требованию, когда возможный (не все они сразу)
  • Кэшируют часто используемые Формы, создают нечастые по требованию
  • , Сохраняют разрешения изображения низко
  • , Если класс представляет, Располагают использование это . Всегда.
  • Никакое приложение не является слишком маленьким для пользы из шаблонов MVC/MVP
  • , не используют порт Microsoft CAB/SCSF для CF (люди, которые портировали его, очевидно, никогда, на самом деле использовал устройство с ограниченными ресурсами)
  • , Знакомятся с понятием "иногда связанного", если Вы будете делать какие-либо удаленные данные / сервисное действие
  • , Прикрепление и Привязка являются Вашим другом, и Ваш враг - тестируют экранные вращения во время выполнения и несколько разрешений (даже если Вы думаете, что не будете нацелены на них, потому что Вы, вероятно, неправы в тех взглядах)
  • Взгляд на, но в большой степени не вкладывайте капитал в тип проекта пакета развертывания устройства. Это имеет основные ограничения, которые, вероятно, укусят Вас. Пакетный файл работает удивительно хорошо, или пользовательская задача MSBUILD назвать CabWiz
  • Повторяют на Вашем C++ и навыках P/Invoke. Вы будете , нуждаются в них. Почти невозможно записать полезное приложение CF без P/Invoking что-то.
  • Код к наименьшему общему знаменателю для целей.
  • Частичные классы являются Вашим другом, специально для деления логики между целевыми типами (PPC, Телефон, немобильный CE).
  • Стараются не запускать приложение от персистентного устройства хранения данных, специально для CE и предварительной WinMo 5. Скопируйте в RAM и работайте оттуда, чтобы препятствовать тому, чтобы подкачка по обращению уничтожила Вас, особенно после цикла сна и бодрствования.
  • Приложения не должны заботиться о переходах сна/следа, но это - чистая теория. След сна ** будет* изменять Ваше поведение приложения, поэтому снова тестировать, тестировать, тест.
  • я упоминал тест? Особенно на каждом устройстве можно ли достать? Подкупите дешевые аппаратные средства eBay для Вашей тестовой лаборатории. Наличие большего количества устройств более важно, чем наличие последнего, если Вы не намереваетесь использовать определенную функцию более нового устройства.
  • Просят божественное вмешательство, если Вы планируете использовать Bluetooth программно. Познакомьтесь со стопками Widcomm и Microsoft и поймите, что они не то же.
  • Часы вебкаст MSDN на управлении памятью в Компактной Платформе. Наблюдайте его снова за материалом, который Вы пропустили в первый раз.
  • Не упускают сон/след, делающий недействительным внутренние дескрипторы и вызывающий нарушения прав доступа. Это более тайно, но конечно происходит. Например, при запуске приложения прочь карты памяти целое приложение не загружается в RAM. Используемые части разбиты на страницы спросом в для выполнения. Это - все хорошо и хороший. Теперь, если Вы выключаете устройство, драйверы все закрытие. Когда Вы включаетесь назад, много устройств просто повторно монтируют устройства хранения. Когда для Вашего приложения нужно к странице спроса в большем количестве программы, это больше не, где это было, и это умирает. Подобное поведение может произойти с базами данных по смонтированным хранилищам. Если у Вас есть открытый дескриптор к базе данных после цикла сна и бодрствования, дескриптор соединения больше не может быть допустимым.
  • Установка пробная версия Platform Builder. Исходный код для большого количества вещей там (как сеть UI, много драйверов, и т.д.) и когда Ваш код P/Invoke не делает то, что Вы ожидаете, что у Вас, по крайней мере, будет место для искания "почему".

добавленный 5/25/10

добавленный 7/27/10

добавленный 11/22/11

  • не предполагает, что просто, потому что пространство имен или класс существуют в BCL, что это на самом деле реализовано любым полезным способом. Сертификаты, конечно, не .

я просто добавляю к списку, поскольку они происходят со мной...

120
ответ дан ctacke 24 November 2019 в 15:13
поделиться

Когда выполнение чего-либо с OutlookSession, всегда

  • инстанцирует его на основном (приложение), поток
  • выполняется против него на основном потоке (я использую Объект управления для Вызова против)
  • , и избавьтесь от него в течение достойного периода времени (если Вы не сделаете то у Вас будет странное поведение в Кармане Outlook)
1
ответ дан PhilChuang 24 November 2019 в 15:13
поделиться

OpenNet CF стоит изучить - даже свободный выпуск имеет, некоторые полезные освобождают - такие как FTP, datagrid дополнительная функциональность и т.д.; который очень полезен, так как CF испытывает недостаток в большом количестве функций платформы .NET.

3
ответ дан sarsnake 24 November 2019 в 15:13
поделиться

Большая часть необычного материала требует прямого вызова Windows API через P/Invoke. Я нашел http://www.pinvoke.net/ быть большим ресурсом для P/Invoke и на Win32 и на Windows CE.

7
ответ дан Martin Liesén 24 November 2019 в 15:13
поделиться

Если необходимо поддерживать несколько экранных размеров/разрешений, наследование формы является отличным способом сделать это. В основном Вы разрабатываете свою форму для установки стандарту 320x240 экран. Для поддержки различного размера экрана Вы просто добавляете новую форму, наследовались Вашей пользовательской форме (вместо просто Формы), и затем перестраиваете средства управления по мере необходимости.

Другой полезный прием должен обернуть вызов ShowDialog способом, который позволяет Вам установить подпись родительской формы на "" временно - это сохраняет все открытые формы в Вашем приложении от разоблачения в под управлением списке программ. Другой способ улучшить обертку к PInvoke SetForegroundWindow с дескриптором родительского окна. Это гарантирует, что родитель будет всегда вновь появляться после того, как дочерний элемент закрывается; без этого вызова для других окон возможно быть вставленным в z-стек выше родительской формы.

Не упускают шифрование на SD-карте. SqlCE прекратит работать в целом. Поведение Oracle Lite при шифровании является намного более зловещим, начиная с частей его работа и части ее не делают.

Избегают репликация слияния и SqlCE RDA. Они были бы фантастическими инструментами, если бы они работали надежно, но они не делают в ситуациях, где сетевое соединение может неожиданно быть отброшено во время репликации (довольно распространенный в мире WM). Этот укусил меня ТРУДНО с производственным приложением. Технология поддержки MS, с которой мы имели дело, была наконец вынуждена подтвердить, что она просто не работает 100%. Фактическая кавычка: "просто продолжайте пытаться копировать - они объединятся правильно в конечном счете".

7
ответ дан MusiGenesis 24 November 2019 в 15:13
поделиться

Это не характерно для всего Компактные устройства Платформы, однако это поднимает, это - ужасная голова намного больше при разработке на них из-за ограничительной разработки ресурса на мобильной платформе.

<час>

Недавно я столкнулся с большим сообщением части потока при управлении утечками памяти, которые помогли мне определить утечку, о которой я не знал в ошибка при установке DataGrid. DataSource в одном из наших мобильных приложений.

При привязке DataGrid, Вы должны не непосредственно использование что-то как:

dgDataGrid.DataSource = dsDataSet;

, Поскольку это создает новый CurrencyManager каждый раз, который правильно не становится избавленным. Вместо этого Вы хотите связать DataGrid с BindingSource сначала для предотвращения утечки ресурсов.

bsData.DataSource = dsDataSet;

dgDataGrid.DataSource = bsData;

, Кто знал? Scott Langham сделал в другое сообщение . Спасибо Scott!

11
ответ дан Community 24 November 2019 в 15:13
поделиться

OpenNETCF является большим ресурсом.

Их Платформа Интеллектуального устройства является реальным, должен иметь при разработке с.NET Компактной Платформы, поскольку столь многие Полные функции платформы отсутствуют [я думаю, что кто-то когда-то сказал.NET, Компактная Платформа является оберткой вокруг NotImplementedException!]

13
ответ дан Mitch Wheat 24 November 2019 в 15:13
поделиться
  • , Если Вы планируете использовать SQL-сервер 3,5 Компактных чтения , этот блог .
  • Там является серьезными проблемами производительности в Компактном SQL Server, и некоторый код может быть в 100 раз медленнее на устройстве по сравнению с рабочим столом, поэтому всегда тестируют Ваш код базы данных устройства.
  • Задающее устройство и производительность / интеграционное тестирование на устройстве. Также очень немного людей на самом деле делают это, дело не в этом сложный и далекие избыточные весы затраты.
  • , Если Вы развертываете свой код все время, используют сеть вместо ActiveSync. Самый легкий путь настраивает простой FTP-сервер или агент TCP на устройстве.
4
ответ дан ollifant 24 November 2019 в 15:13
поделиться

При использовании DataGrid, который можно отсортировать, это - содержание через заголовки столбцов при помощи следующего кода, первоначально размещенного в блоге Chris Craft's:

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);
}
2
ответ дан Mat Nadrofsky 24 November 2019 в 15:13
поделиться

Модульное тестирование (TDD) возможно на .net см. Но есть проблемы.

Вы будете использовать MSTest. Не NUnit, MBUnit, XUnit.net и т. Д. MSTest.

Вам понадобится Visual Studio Professional (насколько я могу судить). Самый простой способ начать работу - щелкнуть правой кнопкой мыши метод, который вы хотите протестировать, затем выбрать «Создать модульный тест». Это настраивает тестовый проект для вас. Создайте только один тестовый проект. Это не нравится иметь несколько. Просто сделайте это, чтобы создать проект и получить все настройки зависимостей для вас. Затем создайте свои собственные тестовые классы.

Могут возникнуть проблемы с фиктивными объектами. RhinoMocks, Moq и TypeMock зависят от того, чего нет в .net cf. У Пекса есть проект «Заглушки», который я до сих пор изучаю. Pex - это исследовательский проект Microsoft. В итоге вы создадите пользовательские поддельные объекты.

Тест запускается на эмуляторе устройства. Это означает, что они должны быть развернуты. Если при первом запуске тестера вы получите странную ошибку, вероятно, у вас еще нет .net 3.5 в эмуляторе устройства. Сначала разверните ваш проект, затем снова запустите тесты.

На стороне, не связанной с тестированием: You do get LINQ to Objects and LINQ to XML. Both are a godsend. You can talk to a server via WCF, but you don't get all of the endpoints.

3
ответ дан 24 November 2019 в 15:13
поделиться
  • Вы столкнетесь с множеством ошибок и ограничений в .net cf. Вам придется по-обезьяньи исправлять их. это некрасиво, но у вас не будет выбора.

  • В итоге вам придется написать множество собственных элементов управления. Поскольку большинство элементов управления в фреймворке не поддерживают функции, которые часто запрашиваются клиентами. Поэтому хорошей практикой является создание собственных элементов управления для каждого элемента управления, который вы используете с самого начала. Даже если в начале работы в них может ничего не быть. Позже вы сможете добавить пользовательскую логику. Без необходимости изменять много существующего кода.

  • Если вам нужна валидация, вы можете использовать .net validation framework

  • Хорошая идея - разбросать код повсюду в вашем приложении. Вы можете использовать паттерн MVC. И если вы решите использовать его, вы можете начать с MobileMVC
  • Если вам нужен богатый набор инструментов UI, вы можете посмотреть на Resco (google).
  • VS Designer будет вашим заклятым врагом.

Это все, что я могу вспомнить прямо сейчас.

2
ответ дан 24 November 2019 в 15:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: