2009-11-04 5 views
0

У меня есть элемент управления Silverlight, который появляется поверх другого (снимите всплывающее окно). В этом всплывающем контроле у ​​меня есть scrollview (высота = 250) с панелью стека (имя экземпляра = spMain, ориентация = вертикально) внутри. Внутри содержимого панели стека расположено несколько текстовых полей, расположенных друг над другом. Когда я перехожу из текстового поля в текстовое поле, scrollviewer автоматически перемещается в нижнюю часть (я написал код в обработчике событий, с которым связаны все текстовые поля).Ошибка вне диапазона при закрытии всплывающего окна

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

 if (sender is TextBox) 
     { 
      TextBox tb = (TextBox)sender; 

      try 
      { 
       // Code bombs out here when I attempt to close out the pop-up control 
       Point pt = tb.TransformToVisual(spMain).Transform(new Point()); 

       if (pt.Y >= scrollViewerHeight - tb.ActualHeight) 
       { 
        svMain.UpdateLayout(); 
        svMain.ScrollToVerticalOffset(scrollViewerHeight += pt.Y); 
       } 
      } 
      catch (ArgumentException aex) 
      { 
       // Don't want to eat the exception 
       string errorMessage = aex.Message; 
       System.Diagnostics.Debug.WriteLine(errorMessage); 
      } 
     } 

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

Есть ли у кого-нибудь идеи о том, как это сделать?

+0

Почему приведенный выше код срабатывает при закрытии всплывающего окна? – Bryant

ответ

1

Я думаю, проблема заключается в том, как вы закрываете всплывающее окно. Вы удаляете его из визуального дерева или просто устанавливаете его видимость для рутинга?

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

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

Смежные вопросы