//Show the emoji popup async Task ShowEmojiPopup() { //Play window open sound PlayInterfaceSound(vConfigurationCtrlUI, "PopupOpen", false, false); //Show the emoji menu border_EmojiListPopup.Visibility = Visibility.Visible; grid_Keyboard.Opacity = 0.60; grid_Keyboard.IsEnabled = false; //Update the help bar textblock_LeftTriggerOff.Text = string.Empty; textblock_RightTriggerOff.Text = "Switch emoji"; //Store close focus button FrameworkElementFocusSave(vEmojiFocusedButtonClose, null); //Focus on popup button if (vEmojiFocusedButtonOpen.FocusListBox == null) { FrameworkElementFocus focusListbox = new FrameworkElementFocus(); focusListbox.FocusListBox = listbox_EmojiList; focusListbox.FocusIndex = vLastPopupListEmojiIndex; await FrameworkElementFocusFocus(focusListbox, vProcessCurrent.MainWindowHandle); } else { await FrameworkElementFocusFocus(vEmojiFocusedButtonOpen, vProcessCurrent.MainWindowHandle); } }
//Save framework focus element public static void FrameworkElementFocusSave(FrameworkElementFocus saveElement, FrameworkElement focusedElement) { try { AVActions.ActionDispatcherInvoke(delegate { //Get the currently focused element if (focusedElement == null) { focusedElement = (FrameworkElement)Keyboard.FocusedElement; } //Check the currently focused element if (focusedElement != null) { //Get focus type Type focusType = focusedElement.GetType().BaseType; //Validate focus type if (focusType == typeof(Window)) { Debug.WriteLine("Invalid element focus type: " + focusType); saveElement = null; return; } //Check if save element is null if (saveElement == null) { Debug.WriteLine("Save element is null creating new."); saveElement = new FrameworkElementFocus(); } //Save focused element saveElement.FocusElement = focusedElement; if (focusType == typeof(ListBoxItem)) { saveElement.FocusListBox = AVFunctions.FindVisualParent <ListBox>(saveElement.FocusElement); saveElement.FocusIndex = saveElement.FocusListBox.SelectedIndex; } Debug.WriteLine("Saved element focus: " + focusedElement + " / index: " + saveElement.FocusIndex); } }); } catch (Exception ex) { Debug.WriteLine("Failed saving element focus: " + ex.Message); } }
//Save framework focus element public static void FrameworkElementFocusSave(FrameworkElementFocus saveElement, FrameworkElement focusedElement) { try { AVActions.ActionDispatcherInvoke(delegate { //Check if save element is null if (saveElement == null) { Debug.WriteLine("Save element is null creating new."); saveElement = new FrameworkElementFocus(); } if (focusedElement != null) { saveElement.FocusElement = focusedElement; if (saveElement.FocusElement != null && saveElement.FocusElement.GetType() == typeof(ListBoxItem)) { saveElement.FocusListBox = AVFunctions.FindVisualParent <ListBox>(saveElement.FocusElement); saveElement.FocusIndex = saveElement.FocusListBox.SelectedIndex; } Debug.WriteLine("Saved focused element: " + focusedElement + " / index: " + saveElement.FocusIndex); } else { //Get the currently focused element FrameworkElement frameworkElement = (FrameworkElement)Keyboard.FocusedElement; //Check the currently focused element if (frameworkElement != null) { saveElement.FocusElement = frameworkElement; if (saveElement.FocusElement != null && saveElement.FocusElement.GetType() == typeof(ListBoxItem)) { saveElement.FocusListBox = AVFunctions.FindVisualParent <ListBox>(saveElement.FocusElement); saveElement.FocusIndex = saveElement.FocusListBox.SelectedIndex; } Debug.WriteLine("Saved focused keyboard: " + frameworkElement + " / index: " + saveElement.FocusIndex); } } }); } catch (Exception ex) { Debug.WriteLine("Failed saving element focus: " + ex.Message); } }
//Show the text popup async Task ShowTextPopup() { try { //Play window open sound PlayInterfaceSound(vConfigurationCtrlUI, "PopupOpen", false); //Show the textlist menu border_TextListPopup.Visibility = Visibility.Visible; grid_Keyboard.Opacity = 0.60; grid_Keyboard.IsEnabled = false; //Store close focus button FrameworkElementFocusSave(vTextFocusedButtonClose, null); //Focus on popup button if (vTextFocusedButtonOpen.FocusListBox == null) { if (vDirectKeyboardTextList.Any()) { FrameworkElementFocus focusListbox = new FrameworkElementFocus(); focusListbox.FocusListBox = listbox_TextList; focusListbox.FocusIndex = 0; await FrameworkElementFocusFocus(focusListbox, vProcessCurrent.MainWindowHandle); } else { await FrameworkElementFocus(key_TextListClose, false, vInteropWindowHandle); } } else { await FrameworkElementFocusFocus(vTextFocusedButtonOpen, vProcessCurrent.MainWindowHandle); } } catch { } }
//Focus framework focus element public static async Task FrameworkElementFocusFocus(FrameworkElementFocus focusElement, IntPtr windowHandle) { try { await AVActions.ActionDispatcherInvokeAsync(async delegate { //Check if focus element is disconnected bool disconnectedSource = false; if (focusElement.FocusElement != null) { disconnectedSource = focusElement.FocusElement.DataContext == BindingOperations.DisconnectedSource; } //Force focus on element if (focusElement.FocusElement != null && !disconnectedSource) { Debug.WriteLine("Focusing on previous element: " + focusElement.FocusElement); await FrameworkElementFocus(focusElement.FocusElement, false, windowHandle); } else if (focusElement.FocusListBox != null && !disconnectedSource) { Debug.WriteLine("Focusing on previous listbox: " + focusElement.FocusListBox); await ListboxFocusIndex(focusElement.FocusListBox, false, false, focusElement.FocusIndex, windowHandle); } else { Debug.WriteLine("No previous focus element, pressing tab key."); await KeySendSingle(KeysVirtual.Tab, windowHandle); } //Reset the previous focus focusElement.Reset(); }); } catch { } }
//Switch the emoji type list by button async void SwitchEmojiTypeListButton(object sender) { try { //Update the emoji selected index UpdateSelectedIndexEmoji(); //Background brush variable SolidColorBrush selectedBrush = (SolidColorBrush)Application.Current.Resources["ApplicationAccentDarkBrush"]; SolidColorBrush defaultBrush = (SolidColorBrush)Application.Current.Resources["ApplicationAccentLightBrush"]; //Reset background brush key_EmojiSmiley.Background = defaultBrush; key_EmojiSmiley.BorderBrush = defaultBrush; key_EmojiActivity.Background = defaultBrush; key_EmojiActivity.BorderBrush = defaultBrush; key_EmojiFood.Background = defaultBrush; key_EmojiFood.BorderBrush = defaultBrush; key_EmojiNature.Background = defaultBrush; key_EmojiNature.BorderBrush = defaultBrush; key_EmojiOther.Background = defaultBrush; key_EmojiOther.BorderBrush = defaultBrush; key_EmojiPeople.Background = defaultBrush; key_EmojiPeople.BorderBrush = defaultBrush; key_EmojiSymbol.Background = defaultBrush; key_EmojiSymbol.BorderBrush = defaultBrush; key_EmojiTravel.Background = defaultBrush; key_EmojiTravel.BorderBrush = defaultBrush; //Switch the emoji list int selectIndex = 0; if (sender == key_EmojiSmiley) { listbox_EmojiList.ItemsSource = vDirectKeyboardEmojiListSmiley; key_EmojiSmiley.Background = selectedBrush; key_EmojiSmiley.BorderBrush = selectedBrush; selectIndex = vDirectKeyboardEmojiIndexSmiley; } else if (sender == key_EmojiActivity) { listbox_EmojiList.ItemsSource = vDirectKeyboardEmojiListActivity; key_EmojiActivity.Background = selectedBrush; key_EmojiActivity.BorderBrush = selectedBrush; selectIndex = vDirectKeyboardEmojiIndexActivity; } else if (sender == key_EmojiFood) { listbox_EmojiList.ItemsSource = vDirectKeyboardEmojiListFood; key_EmojiFood.Background = selectedBrush; key_EmojiFood.BorderBrush = selectedBrush; selectIndex = vDirectKeyboardEmojiIndexFood; } else if (sender == key_EmojiNature) { listbox_EmojiList.ItemsSource = vDirectKeyboardEmojiListNature; key_EmojiNature.Background = selectedBrush; key_EmojiNature.BorderBrush = selectedBrush; selectIndex = vDirectKeyboardEmojiIndexNature; } else if (sender == key_EmojiOther) { listbox_EmojiList.ItemsSource = vDirectKeyboardEmojiListOther; key_EmojiOther.Background = selectedBrush; key_EmojiOther.BorderBrush = selectedBrush; selectIndex = vDirectKeyboardEmojiIndexOther; } else if (sender == key_EmojiPeople) { listbox_EmojiList.ItemsSource = vDirectKeyboardEmojiListPeople; key_EmojiPeople.Background = selectedBrush; key_EmojiPeople.BorderBrush = selectedBrush; selectIndex = vDirectKeyboardEmojiIndexPeople; } else if (sender == key_EmojiSymbol) { listbox_EmojiList.ItemsSource = vDirectKeyboardEmojiListSymbol; key_EmojiSymbol.Background = selectedBrush; key_EmojiSymbol.BorderBrush = selectedBrush; selectIndex = vDirectKeyboardEmojiIndexSymbol; } else if (sender == key_EmojiTravel) { listbox_EmojiList.ItemsSource = vDirectKeyboardEmojiListTravel; key_EmojiTravel.Background = selectedBrush; key_EmojiTravel.BorderBrush = selectedBrush; selectIndex = vDirectKeyboardEmojiIndexTravel; } //Focus on the current emoji FrameworkElementFocus focusListbox = new FrameworkElementFocus(); focusListbox.FocusListBox = listbox_EmojiList; focusListbox.FocusIndex = selectIndex; await FrameworkElementFocusFocus(focusListbox, vProcessCurrent.MainWindowHandle); } catch { } }