Сообщения

Сообщения за март, 2010

Error message: cannot access non-static method in static context.

Вот одна из причин этого сообщения: Инициализация поля происходит вне конструктора, причем при инициализации требуется нестатический метод класса. Пример: Поле класса хранит ссылку на таймер. При инициализации нужно в конструктор таймера передать не статический метод класса, который будет служить обработчиком тиков таймера. В этом случае и возникнет эта ошибка. Нужно инициализацию таймера просто перенести в конструктор класса. Следующий код не даст скомпилироваться: private readonly Timer _timer = new Timer (state => MyMethod(MyParam ), SomeState , Some Interval, Some Interval ); В этом случае нужно переписать так: private readonly Timer _timer; public MyClass() {     _timer = new Timer (state => MyMethod(MyParam ), SomeState , Some Interval, Some Interval ); } .

Silverlight: Как определить активно ли приложение / окно Silverlight, имеет ли оно фокус.

Silverlight 3. У меня был некий перерыв в работе с Silveright и что-то я не вспомнил, как определить, что окно / приложение Silverlight активно или нет. И сделать это нужно вне зависимости, браузерное это приложение Silverlight или это "Out Of Brouser", всю страницу в браузере это занимает или нет.   Проблема в том, что события LostFocus и GotFocus не дают возможности определить, что приложение активно или нет.   Пока я это сделал через отслеживание событий на корневом элементе - Application .Current.RootVisual .   Если вы мне подсажете / напомните, как это определять более красиво, то буду вам очень благодарен.   Конечно я это не тестировал на всех вариантах работы Silverlight, но полагаю, что это должно работать.   Идея следующая, например, для определения того, что приложение не активно: Если после события потери фокуса происходит событие MouseLeave, то значит приложение перестало быть активным. Любое же событие получение фокуса говорит о том, что приложени стало активным.

Silverlight: Популярный вариант утечки памяти связанный с динамическиизменяемым деревом элементов приложения Silverlight.

Изображение
Нужно помнить следующий вариант утечки памяти, т.к., как мне кажется, он один из самых частых. Вы создали элемент. (Все, забудьте в WPF / Silverlight слово "контрол"  ). Вы добавляете этот элемент динамически в дерево элементов приложения Silverlight. По действию пользователя вы заменяете этот элемент его новым инстансом (экземпляром). Все красиво работает, все заменяется и потом удаляется сборщиком мусора, но до тех пор, пока вы не привяжете методы экземпляра вашего элемента, как обработчики событий элементов, постоянно находящихся в иерерхии элементов вашего Silverlight приложения. Например, очень часто нужно реагировать на события Application .Current.RootVisual . ! Будте внимательны. Как только вы начинаете использовать элемент, как динамически добавляемый / заменяемый / удаляемый, то вы больше не может (не имеете права) привязывать методы его экземпляра к событиям элементов постоянно находящихся в иерархии приложения Silverlight, т.к. в этом случае уда

Silverlight: "Тонкий" баг в TreeView при снятии выделения со всехэлементов.

Silverlight 3.0, TreeView from Toolkit October 2009. Задача: Если снять выделение со всех элементов TreeView, то ранее выделенный элемент опять станет выделенным, если окно Silverlight тут же потеряет фокус а потом получит опять. Решение: Недостаточно просто снять выделение с элемента TreeView, нужно так же снять с него фокус. Вот код, который обходит эту проблему. public static void UnseslectAllTreeViewItems( TreeView treeView) {     //treeView.SetSelectedContainer(null);     var selectedContainer = treeView.GetSelectedContainer();      if (selectedContainer != null )      {          selectedContainer.IsSelected = false ;      }     // Bug resolving     var focusedElement = FocusManager .GetFocusedElement();     if (focusedElement != null         && focusedElement == selectedContainer)     {         treeView.Focus();     } }

Silverlight: TreeView Unselect All Items (v.2).

Silverlight 3.0, TreeView from Toolkit October 2009. Задача: В элементе TreeView у которого есть выбранный дочерний ItemTreeView сделать так, чтоб не один элемент не был выбран. Простая задача, но что если у вас она не работает! Решение: Есть! Предположим вы используете следующий код: var selectedContainer = VerticalMenuTreeView.GetSelectedContainer(); if (selectedContainer != null) {     selectedContainer.IsSelected = false; } или такой: OrgTreeView.SetSelectedContainer(null); но он не дает никакого результата. Скорее всего вы прибиндили SelectedValue вашего TreeView к какому-то элемненту и забыли в привязке указать Mode=OneWay . Вот правильный XAML: DataContext ="{ Binding SelectedValue , ElementName =OrgTreeView, Mode =OneWay}" А вот XAML приводящий к багу: DataContext ="{ Binding SelectedValue , ElementName =OrgTreeView}" Главное не забудте указать Mode=OneWay  во всех привязках! Когда вы пытаетесь в коде первым или вторым способом снять выделение в дереве,

WEB-серия. Разделение состояний между вкладками браузера одного сайтадля WEB-сервера

Задача: Нужно разделить состояние сессии, которое обычно подтягивается (извлекается для запроса) по ключу в Cookie. Так как сессионные коки общие для всех вкладно одного сайта в одном окне (и общие для окон открытых по Контрол-N), то разделить сессионные данные невозможно между разными вкладками одного сайта. Это особенно критично для корпоративных приложений. Решение: На данный момент решение в HTTP только одно – добавить ключк в строку запроса. То есть добавить ключ в QueryString. По этому ключу различать состояния сессий. Замечания для ASP.NET: Не используйте для хранения таких данных Session! Используйте Cache. Проблема: При таком решении обновление страницы (F5) приводит к поторе ее состояний, т.к. трудно отличить открытие новой вкладки и обновление страницы. Хотя, это возможно при помощи JavaScript и Cookie. Это было сделано более двух лет назад и тогда я перепробоавл много вариантов, но реально рабочий оказался этот.

WPF-серия. Прокрутка окна с замораживанием главного меню и вкладоквверху / внизу страницы

(Этот пост только для меня родного, т.к. боюсь я тут не совсем хорошо объяснил этот трюк из мира WEB) Не смог найти встроенный стандартный способ фиксации верхнего меню окна / страницы в WPF, так, чтоб весь остальной контент можно было прокручивать. Немного поколдовал и сделал через биндинг, свойство зависимости и расчет размера (высота страницы минус высота меню и для ширины так же). Получилось идеально и красиво, но может вы знаете стандартные подходы, как этого добиться.

Офис: Возможно ли вставить в документ Office переключатель (радио-кнопки, Radio Buttons ), флажок ( CheckBox, чекбокс ), чтоб онисохраняли свое состояние.

Задача: Узнать, возможно ли вставлять в документ офис, чекбоксы ( флажки ), радиокнопки (переключатели), чтоб они сохраняли занчение выбора. Решение: Да возможно. Поищите их в меню и добавте в документ в нужное место. После этого они буду сохранять свое состояние после сохранения и повторного открытия.

Silverlight: TreeView Multi Selection and Multi Drag & Drop.

Silverlight 3.0, TreeView from Toolkit October 2009. Tags: TreeView MultiSelection and Multi Drag & Drop. Yes! We do it! :) Изменено: v.1.2. Задача: Сделать чтоб в TreeView можно было выбирать мнгого элементов. Также обеспечить для выбранных элементов множественный Drag And Drop. Решение: Реализовать множественный выбор и Drag Drop в TreeView можно через низлежащий объект данных. А точноее через иерархию этих объектов. Нужно, также, реагировать на нажатие клавиш Контрол и Шифт. На самом деле, если вы захотите польностью подражать поведению проводника Windows, к примеру, то вам понадобится еще много чего сделать и поковыряться в событийной модели Silverlight. Например определить, когда приложение Silverlight активно, а когда фокус находится в другом окне. Код я не выкладываю, т.к. это написано для одного приложения. Не могу сейчас тратить время на вынос в красивый самостоятельный функционал, т.к. используется много другого разработанного функционала, например отложенное выделение /

Миграция WCF с проекта Web-сайт на проект Web-application в VisualStudio

Решение: Есть. Задача: Перенести файлы WCF .svc и относящиеся к ним файлы кода из VS 2008 Website в Web Application. Прочитать http://gurustop.net/blog/2008/08/03/converting-vs-2008-website-to-web-application/ Перенести .svc из Website проекта в Web Application. Из папки App_Code пененести в корень Web Application соответствующий .cs файл. Соответствующий .cs файл переименовать так: было my.cs стало my.svc.cs. Исключить .svc.cs из проекта. Создать произвольный .svc файл для сразвнения. Открыть через контекстное меню Open With выбрав XML Editor оба .svc файла. Привести к соответствию перенесенный файл задав в атрибут CodeBehind правильное значение. Для этого удалите “~/App_Code/” и “my.cs” замените на “my.svc.cs”. Включить в проект .svc.cs. При этом файл кода станет автоматически дочерним для .svc файла. Писал на скорую руку, если непонятно, связывайтесь. Если вы добавите или переименуете namespace у файла кода, то должны будете поправить настройки привязок в web.c