Тэги

Silverlight (36) WPF (10) IIS (7) Visual Studio (7) SharePoint (6) .Net Framework (5) ODP.NET (5) ASP.NET (4) C# (4) common (4) Network Settings (3) JavaScript (2) MS Office (2) Resharper (2) WCF (2) WEB (2) XPath (2) XSLT (2) ADO.NET (1) APEX (1) CMD (1) CSS (1) EF (1) HTML (1) Hardware bugs (1) Java (1) MS SQL (1) Oracle (1) PDF (1) Version Control (1) XAML (1)

вторник, 30 марта 2010 г.

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

Вот одна из причин этого сообщения:

Инициализация поля происходит вне конструктора, причем при инициализации требуется нестатический метод класса.

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

В этом случае и возникнет эта ошибка.

Нужно инициализацию таймера просто перенести в конструктор класса.

Следующий код не даст скомпилироваться:

private readonly Timer _timer = new Timer(state => MyMethod(MyParam), SomeState, SomeInterval, SomeInterval);


В этом случае нужно переписать так:

private readonly Timer _timer;

public MyClass()
{
    _timer = new Timer(state => MyMethod(MyParam), SomeState, SomeInterval, SomeInterval);
}

.

четверг, 11 марта 2010 г.

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

Silverlight 3.

У меня был некий перерыв в работе с Silveright и что-то я не вспомнил, как определить, что окно / приложение Silverlight активно или нет. И сделать это нужно вне зависимости, браузерное это приложение Silverlight или это "Out Of Brouser", всю страницу в браузере это занимает или нет.

 

Проблема в том, что события LostFocus и GotFocus не дают возможности определить, что приложение активно или нет.

 

Пока я это сделал через отслеживание событий на корневом элементе - Application.Current.RootVisual.

 

Если вы мне подсажете / напомните, как это определять более красиво, то буду вам очень благодарен.

 

Конечно я это не тестировал на всех вариантах работы Silverlight, но полагаю, что это должно работать.

 

Идея следующая, например, для определения того, что приложение не активно: Если после события потери фокуса происходит событие MouseLeave, то значит приложение перестало быть активным.

Любое же событие получение фокуса говорит о том, что приложени стало активным.

среда, 10 марта 2010 г.

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

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

Вы создали элемент. (Все, забудьте в WPF / Silverlight слово "контрол" Улыбка ).
Вы добавляете этот элемент динамически в дерево элементов приложения Silverlight.
По действию пользователя вы заменяете этот элемент его новым инстансом (экземпляром).

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

Например, очень часто нужно реагировать на события Application.Current.RootVisual.

! Будте внимательны. Как только вы начинаете использовать элемент, как динамически добавляемый / заменяемый / удаляемый, то вы больше не может (не имеете права) привязывать методы его экземпляра к событиям элементов постоянно находящихся в иерархии приложения Silverlight, т.к. в этом случае удаленные / замененные экземпляры вашего элемента не будут уничтожатся сборщиком мусора благодаря механизму событий в .NET Framework.

Вариантов обхода этого ограничения много (Prism: Event Aggregator), поэтому используйте нужный вам по обстоятельствам.

Или используйте слабую ссылку - WeakReference

Чтобы копнуть глубже есть статья Слабые события в C#.

четверг, 4 марта 2010 г.

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 во всех привязках!

Когда вы пытаетесь в коде первым или вторым способом снять выделение в дереве, то вы, фактически, задаете в SelectedValue вашего TreeView значение null и поэтому функционал привязки (binding) без Mode=OneWay отрабатывает, как и положено в этом случае, и передает в SelectedValue прежнее выбранное значение.
И биндингу плевать, что вы то сами не можете из кода задать SelectedValue вашего дерева, т.к. у него нет открытого сеттера (set{}).

Ну чтож, ознакомлен, значит вооружен.

Вот тема из форума Silverlight на этот счет: http://forums.silverlight.net/forums/p/151973/341208.aspx

вторник, 2 марта 2010 г.

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 активно, а когда фокус находится в другом окне.

Код я не выкладываю, т.к. это написано для одного приложения. Не могу сейчас тратить время на вынос в красивый самостоятельный функционал, т.к. используется много другого разработанного функционала, например отложенное выделение / развертывание нод в TreeView. Также, я надеюсь, что это появиться в Silverlight 4 или каком-то из последующих Toolkit.

Изначально нужно создать объект данных со свойством IsSelectedLogicaly, например. Настройте стили в разметке XAML (ну или в файле кода) которые будут реагировать на это свойство.

Доработайте этот объект дынных, чтоб через него было удобно работать с иерархией таких объектов. Например получать родителя, родителей, потомков. Или определять, что объект является предком другого объекта иерархии.

Запрограммируйте дополнительно TreeView, чтоб по клику на +/- свойство IsSelectedLogicaly не менялось.

И это не все. Чтоб это работало как часы вместе с Drag & Drop нужно еще, к сожалению, учесть много мелочей.
Например, по аналогии с проводником Windows, мне пришлось определять и реагировать на состояние, когда приложение / окно Silverlight перестает быть активным. Отлавливать попытку всатвки родителя в потомка (это уже было реализовано в виде "игнорирования", но только для единичного выделения).

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

Подробности, если случиться, вы найдете в решении "MTC - Анализатор Счета", меню "Абоненты" от компании iFlex.ru.

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

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