2011-11-09 4 views
1

У меня есть кнопки управления, которая требует добавления обработчика к корню:Удаление дополнительного обработчика в отдельный элемент управления?

 Application.Current.RootVisual.AddHandler(UIElement.MouseLeftButtonDownEvent, new MouseButtonEventHandler(RootClicked), true); 

Проблема заключается в том, что, когда я делаю это RootVisuual UIElement никогда не уничтожает себя из-за ссылки создается.

Есть ли способ проверить, когда RootVisual больше не виден, поэтому я могу разыменовать связанное с ним событие или хотя бы каким-то другим способом динамически удалить дескриптор?

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

С WeakReferences Я попытался следующие:

m_clickEventHandler = new MouseButtonEventHandler(RootClicked); 
m_weakRefToRoot = new WeakReference(Application.Current.RootVisual); 
(m_weakRefToRoot.Target as UIElement).AddHandler(UIElement.MouseLeftButtonDownEvent, m_clickEventHandler, true); 
+0

В какой ситуации внешний вид корня не может быть видимым. это после того, как программа ушла, что ее еще не освобождает память? – tam

+0

Корневой визуал - это страница входа в систему, как только пользователь регистрируется на странице входа в систему, должен быть удален и удален, если только я не добавил к нему обработчик. Поэтому мне нужен способ удалить обработчик, чтобы GC знал, чтобы восстановить страницу входа. – tweetypi

+0

Вы пытались отказаться от подписки на дескриптор в незагруженном событии? – tam

ответ

2

Не пытайтесь отводом о с WeakReferences своей трудной вещью, чтобы получить право. tam был на правильном пути, используйте разгруженное событие. True UIElement не имеет такого события, но ваша страница входа в систему будет чем-то, что в конечном итоге происходит от FrameworkElement. Следовательно: -

Delegate clickedHandler = new MouseButtonEventHandler(RootClicked); 
FrameworkElement root = (FrameworkElement)Application.Current.RootVisual; 
RootedEventHandler unloadHandler = null; 
unloadHandler = (s, args) => 
{ 
     root.Unloaded -= unloadHandler; 
     root.RemoveHandler(UIElement.MouseLeftButtonDownEvent, clickedHandler); 
}; 

root.AddHandler(UIElement.MouseLeftButtonDownEvent, clickedHandler , true); 
root.Unloaded += unloadHandler; 
+0

Я застрял в Silverlight 3.0 земли, которая, к сожалению, не имеет разгруженного события ... – tweetypi

+0

@meds: In в этом случае вам понадобится помощь любого кода, который переназначает значение RootVisual. В качестве альтернативы используйте общую страницу, которая представляет собой корневую визуальную систему, содержащую «Frame», где вы показываете Login, а затем все, что вы обычно заменили RootVisual. – AnthonyWJones

1

http://msdn.microsoft.com/en-us/library/system.weakreference(v=vs.95).aspx

WeakReference доступен в Silverlight 3,4. Должно быть решение проблемы.

Кроме того, я не в курсе SilverLight 3.5

+0

Я пробовал использовать слабые ссылки уже, но либо я делаю это неправильно, либо это не solvign моя проблема ... – tweetypi

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