Вопрос по custom-controls, c#, visual-studio-2008 – Visual Studio 2008 IDE неправильно отображает пользовательские элементы управления

5

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

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

Rendering Issue

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

Bizarre

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

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

Rendering Correctly

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

UPDATE - Issue traced, can't explain it

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

<code>  iVirtualDocket
    - References iVirtualDocket.UIControls
    - References iVirtualDocket.CodeLibrary
  iVirtualDocket.UIControls
    -References iVirtualDocket.CodeLibrary
</code>

Подпись имеет свойство под названиемSignatureData, который делал это:

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

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

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

    return ret;
}
</code>

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

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

<code>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;
        }
    }
}
</code>

(What's even more bizarre is that I don't even use this property yet.)

@Phil - это тот же метод, только опечатка. djdd87
Я постараюсь собрать репро как можно скорее. djdd87
Я не думаю, что вы могли бы опубликовать полное (но сокращенное) решение, которое демонстрирует проблему, не так ли? Phil
CodeLibrary.Conversions.ImageToByteArray не является тем же методом, что и ConvertImageToByteArray. Phil
Попробуйте запустить второй экземпляр VS, установите break для всех сгенерированных исключений. Прикрепить к первому экземпляру VS. Теперь загрузите ваш проект, который отображает проблему. Посмотрите, поймаете ли вы какие-либо исключения. Phil

Ваш Ответ

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;
}

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

У меня была та же проблема снова при использованииDllImport, Все, что мне нужно было сделать, это создать файл DesignTimeAttributes.xmta и исправить это и предыдущую проблему. djdd87
0

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

По вашим скриншотам я предполагаю, что вы используете 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

о хорошо, извините, я не смогу помочь
Привет, это не WPF. Это WM6 (Compact Framework) в Visual Studios 2008. Это не проблема, потому что, как я уже сказал, свойство не вызывается (в моем конструкторе или где-либо еще). djdd87

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