Еще одно полезное использование для Dispatcher.Invoke
- это немедленное обновление пользовательского интерфейса в функции, выполняющей другие задачи:
// Force WPF to render UI changes immediately with this magic line of code...
Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.ContextIdle);
Я использую это, чтобы обновить текст кнопки до « Обработка ... "и отключить его при выполнении запросов WebClient
.
Можно использовать класс ExternalInterface в Flash для вызова JavaScript. Например, Вы могли настроить функцию через определенный интервал (Событие. ENTER_FRAME, например) для вызывания функции JavaScript, которую упомянул @Diodeus:
document.body.focus();
Или, еще лучшее решение состояло бы в том, чтобы добавить слушателя события корня флэш-памяти (этап) для прислушиваний, когда мышь оставляет Flash. Можно настроить это событие для перемещения фокуса в document.body.
AS3
package {
import flash.display.*;
import flash.events.*;
import flash.external.ExternalInterface;
public class TestMouseLeave extends Sprite
{
public function TestMouseLeave()
{
// Add event listener for when the mouse LEAVES FLASH
addEventListener(MouseEvent.MOUSE_OUT, onMouseLeave);
}
private function onMouseLeave(ev:Event):void
{
var jslink = new ExternalInterface();
jslink.call("changeFocus");
}
}
}
Javascript на Вашей странице:
<script type="text/javascript" language="javascript">
function changeFocus(){
document.body.focus();
}
</script>
Сообщенный мне, если Вы хотите пример AS2, и я развешу его.
Требуемый для записывания об этом решении: Как только Вы продвигаете фокус назад к браузеру, Вы потребуете, чтобы пользователь нажал на плагин Flash снова для активации ввода данных пользователем в плагине флэш-памяти. Это могло быть резким пользовательским опытом и является чем-то для рассмотрения при использовании этого решения.
Я думаю потребности Adobe отбросить фокус, когда мышь выходит из своей клиентской области, или предоставьте возможность делать так.
Однако я думаю большинство разработчиков Flash (и особенно те, кто делает игры), полагаются на то, что ввод с клавиатуры пойман приложением флэш-памяти независимо от того, где мышь.
Можно возвратиться, фокус к браузеру путем выполнения geturl может, называя JavaScript на странице HTML:
document.body.focus()
, Как Вы, это в Вашем фильме Flash будет зависеть от того, как взаимодействие с пользователем с фильмом работает. Вы могли продолжать делать его на таймере, или когда управление теряет фокус, или когда мышь перемещается. Это зависит.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init();">
<mx:Script>
<![CDATA[
private function init():void {
i.setFocus();
this.addEventListener(KeyboardEvent.KEY_UP,keyPressed);
}
private function keyPressed(event:KeyboardEvent):void {
if(event.keyCode.toString()=="84" && event.ctrlKey==true)
ExternalInterface.call('newtab');
}
]]>
</mx:Script>
<mx:TextInput x="23" y="268" width="256" id="i" text="Text Box"/>
</mx:Application>
<script type="text/javascript">
function newtab(e){
document.body.focus();
window.open('about:blank');
}
</script>
Теперь, что происходит с другими клавиатурами? действительно ли 84 является стандартным для T? Мне нравится идея фокуса, но в полных приложениях браузера нет такого же количества комнаты для потери фокуса. Пользователь мог изменить ключевую комбинацию также, я не думаю, что это большая часть полной фиксации для этого без флэш-памяти, опрашивающей конфигурацию команды от браузера и затем прислушивающейся к комбинации, как мы в основном делаем здесь. Я не знаю.
Это также просто пытается открыть новое окно после предоставления фокуса, нет никакого смысла мне в том, чтобы заставлять пользователя нажать его дважды, если они не блокируют окно как всплывающее окно. Но фокус называют первым так, если это происходит, вторая попытка должна работать. Вы могли предупредить пользователя в приложении браузера в случае необходимости.