Среда IDE Visual studio 2008 неправильно отображает пользовательские элементы управления



Во время разработки у меня возникли проблемы со всеми моими формами и пользовательскими элементами управления в Visual Studios 2008. До предыдущей регистрации все элементы управления отображались так, как ожидалось. Единственное основное различие между текущей версией и предыдущей рабочей версией состояло в том, что свойство элемента управления UIText было переименовано из Content в Value. Другие изменения включают добавление новой формы и 3 новых перечислений, но, конечно, нет никаких очевидных изменений, которые повлияли бы на все формы в программе (включая новые).



Все элементы управления (в каждой форме) теперь отображаются как поле с именем элемента управления (однако все они отображаются правильно во время выполнения):



Проблема Рендеринга



Я попытался создать совершенно новую форму в своем проекте, создав совершенно новый пользовательский элемент управления с простой меткой на нем, и у меня все еще есть точно такая же проблема:



Странный



Обратите внимание, что стандартные элементы управления формами .Net работают нормально, поэтому это только проблема с пользовательскими контроли.



Если я восстановлю свою предыдущую версию из репозитория, то все снова начнет отображаться правильно:



Рендеринг Правильно



Я мог бы просто вернуться к этой рабочей версии и продолжить, но я предпочел бы знать, как исправить проблему, если она возникнет снова. Я публикую здесь, надеясь, что это проблема программирования, как приложение к выпуску Visual Studios 2008 (на SP1, кстати).

Обновление-проблема прослежена, не могу объяснить это



Яисправил проблему. Ну, исправлено-не совсем подходящее слово для этого. Я обнаружил проблему, удалив все пользовательские элементы управления 1 за один раз, пока форма снова не начала правильно отображаться. Проблема была в моем контроле подписи (который присутствовал в течение веков, только в моей последней регистрации я добавил ссылку на проект iVirtualDocket.CodeLibrary в основной проект:



  iVirtualDocket
- References iVirtualDocket.UIControls
- References iVirtualDocket.CodeLibrary
iVirtualDocket.UIControls
-References iVirtualDocket.CodeLibrary


Сигнатура имеет свойство под названием SignatureData, которое делает это:



public byte[] SignatureData
{
get
{
if (_signature == null)
{
return null;
}
else
{
return iVirtualDocket.CodeLibrary.Conversions.ImageToByteArray(
_signature, ImageFormat.Png);
}
}
}


ImageToByteArray выглядит следующим образом: следующее:



public static byte[] ImageToByteArray(Image imageToConvert,
ImageFormat formatOfImage)
{
byte[] ret;
using (MemoryStream ms = new MemoryStream())
{
imageToConvert.Save(ms, formatOfImage);
ret = ms.ToArray();
}

return ret;
}


Если я перемещаю вышеупомянутый метод в проект UIControls, то все работает нормально. Однако, как только я помещаю метод обратно в проект CodeLibrary и вызываю его там, все мои формы перестают отображать UserControls.



Таким образом, следующие действия исправляют проблему, но я действительно хотел бы знать, почему:



public byte[] SignatureData
{
get
{
if (_signature == null)
{
return null;
}
else
{
// Need to call this code directly here instead of through
// the CodeLibrary conversions, otherwise all user controls stop
// rendering in design mode
byte[] ret;
using (MemoryStream ms = new MemoryStream())
{
_signature.Save(ms, ImageFormat.Png);
ret = ms.ToArray();
}

return ret;
}
}
}


(что еще более странно, так это то, что я даже не использую эту собственность.)

585   2  

2 ответов:

У нас есть приложение, которое имело аналогичные проблемы с отображением времени, не связанного с дизайном. Проведя некоторое исследование (и я не помню точно, где мы его нашли), мы в конечном итоге создали файл

DesignTimeAttributes.xmta

Его тип-это "файл атрибутов времени разработки"

И в нем мы просто должны были объявить каждый из классов управления, которые мы определили и квалифицировали его как "DesktopCompatible". Таким образом, он, по-видимому, говорит дизайнеру, что его можно рисовать, и фактическая функциональность в некоторых элементах управления (также сигнатурный элемент управления на портативном сканере для нас) фактически вызывается что-то во время выполнения, что не было доступно в конструкторе. Содержание файла было примерно таким...

<?xml version="1.0" encoding="utf-16"?>
<Classes xmlns="http://schemas.microsoft.com/VisualStudio/2004/03/SmartDevices/XMTA.xsd">
  <Class Name="MyNamespace.MyControl">
    <DesktopCompatible>true</DesktopCompatible>
  </Class>

  <Class Name="MyNamespace.MyOtherControl">
    <DesktopCompatible>true</DesktopCompatible>
  </Class>

  <Class Name="AnotherNamespace.MySignControl">
    <DesktopCompatible>true</DesktopCompatible>
  </Class>
</Classes>

Это было также В дополнение к комментариям, представленным ответом csauve. Если конструктор пытается инициализировать что-то, зависящее от устройства, и таким образом выдает ошибку, потому что время разработки явно не содержит библиотеки DLL устройства, элементы управления или что-то еще может / также убьет этот контроль во время разработки. Мы создали две статические функции для тестирования в любом случае через

public static bool IsDesignTime()
{
  return System.ComponentModel.LicenseManager.UsageMode ==
         System.ComponentModel.LicenseUsageMode.Designtime;
}

public static bool IsRunTime()
{
  return System.ComponentModel.LicenseManager.UsageMode ==
         System.ComponentModel.LicenseUsageMode.Runtime;
}

И вызываем их соответственно в конструкторах...

Я думаю, что, возможно, вам нужно, чтобы ваши элементы управления знали, когда они находятся в режиме разработки. Если этого можно избежать, конструктор без параметров вашего элемента управления не должен выполнять никаких операций, которые являются дорогостоящими или имеют побочные эффекты (т. е. загрузка файла с диска).

Я предполагаю по вашим скриншотам, что вы используете WPF. Я считаю, что режим проектирования может быть определен с помощью DesignerProperties.GetIsInDesignMode (это)

видишь http://msdn.microsoft.com/en-us/library/system.componentmodel.designerproperties.getisindesignmode.aspx

public partial class MyControl : UserControl
{
   public MyControl()
   {
      InitializeComponent();
      if (!DesignerProperties.GetIsInDesignMode(this))
      {
        //Do expensive operations here
      }
   }
}

Возможно, вы также захотите прочитать текст http://blogs.msdn.com/b/jgalasyn/archive/2007/10/29/troubleshooting-wpf-designer-load-failures.aspx

Comments

    Ничего не найдено.