private void CreateNewToDoItem(TextBox textBox) { var list = textBox.DataContext as ViewModels.TodoListViewModel; list.AddCommand.Execute(textBox.Text); textBox.Text = string.Empty; textBox.Focus(Windows.UI.Xaml.FocusState.Programmatic); if (AddNewItemConfirmButton != null) AddNewItemConfirmButton.IsEnabled = false; }
public bool ShowKeyboardInput() { if (IsXAML) { // RunAsync all of the UI info. dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { // Create a TextBox that will be added to our view but hidden hiddenKeyInput = new Windows.UI.Xaml.Controls.TextBox(); hiddenKeyInput.Opacity = 0; // We will only be generating one character at a time and does not // matter about the font. All we need is the text. hiddenKeyInput.Width = 1; hiddenKeyInput.Height = 1; hiddenKeyInput.MaxWidth = 1; // Create an input scope for us. Probably not needed var scope = new Windows.UI.Xaml.Input.InputScope(); var name = new Windows.UI.Xaml.Input.InputScopeName(); name.NameValue = Windows.UI.Xaml.Input.InputScopeNameValue.Default; scope.Names.Add(name); hiddenKeyInput.InputScope = scope; // Set spell checking off. hiddenKeyInput.IsSpellCheckEnabled = false; // Add our hidden TextBox to our panel content.Children.Add(hiddenKeyInput); // InputPane does not work in this scenario // We need to listen to GotFocus and LostFocus Events hiddenKeyInput.GotFocus += OnGotFocus; hiddenKeyInput.LostFocus += OnLostFocuc; // Hook up our key delegates hiddenKeyInput.KeyDown += OnKeyDown; hiddenKeyInput.KeyUp += OnKeyUp; // enable us and set focus hiddenKeyInput.IsEnabled = true; hiddenKeyInput.Focus(Windows.UI.Xaml.FocusState.Programmatic); } ); } else { } return(true); }
/// <summary> /// Visualizza una finestra di dialogo con TextBox /// </summary> public static async Task<DialogTextBoxResult> DialogTextBox(string content, string title, string box="", string ok="ok", string cancel="annulla", string sub=null, string header=null, InputScopeNameValue scopename=InputScopeNameValue.Default) { DialogTextBoxResult risposta = new DialogTextBoxResult(); risposta.result=false; risposta.output=null; StackPanel stack = new StackPanel(); if(content != null) { TextBlock contenuto = new TextBlock(); contenuto.Text = content; stack.Children.Add(contenuto); } InputScope scope = new InputScope(); scope.Names.Add(new InputScopeName(scopename)); TextBox tb = new TextBox(); tb.Text=box; tb.InputScope = scope; tb.Header = header; tb.Margin = new Thickness(0,5,0,5); stack.Children.Add(tb); if(sub!=null) { TextBlock subba = new TextBlock(); subba.Text=sub; subba.TextWrapping = TextWrapping.Wrap; stack.Children.Add(subba); } ContentDialog cd = new ContentDialog(); cd.Title = title; cd.Content = stack; cd.PrimaryButtonText = ok; cd.PrimaryButtonClick+= (s, ev) => { risposta.result=true; risposta.output=tb.Text; }; cd.SecondaryButtonText=cancel; cd.SecondaryButtonClick+= (s, ev) => { risposta.result=false; risposta.output=null; }; cd.Opened+=(s, ev) => { tb.Focus(FocusState.Keyboard); tb.SelectAll(); }; await cd.ShowAsync(); return risposta; }
/// <summary> /// Display the keyboard input panel /// </summary> private static void BeginShowKeyboardInput_Win8(string title, string body, string initialValue) { TextBlock textTitle; TextBlock textBody; Grid gridInputArea; StackPanel stackButtons; // Create a grid to add to the page. The grid will fill the entire page and has a // semi-transparent black background to "mark" the graphics behind. _gridBackground = new Grid(); _gridBackground.HorizontalAlignment = Windows.UI.Xaml.HorizontalAlignment.Stretch; _gridBackground.VerticalAlignment = Windows.UI.Xaml.VerticalAlignment.Stretch; _gridBackground.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) }); _gridBackground.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto }); _gridBackground.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) }); _gridBackground.Background = new SolidColorBrush(Windows.UI.Color.FromArgb(100, 0, 0, 0)); // Create another grid to appear as a strip across the center of the screen, inside which // the popup text, input box and buttons will be displayed gridInputArea = new Grid(); gridInputArea.Background = new SolidColorBrush(Windows.UI.Color.FromArgb(255, 220, 220, 220)); gridInputArea.HorizontalAlignment = HorizontalAlignment.Stretch; gridInputArea.VerticalAlignment = VerticalAlignment.Stretch; gridInputArea.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto }); gridInputArea.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto }); gridInputArea.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto }); gridInputArea.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto }); gridInputArea.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(20, GridUnitType.Star) }); gridInputArea.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(60, GridUnitType.Star) }); gridInputArea.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(20, GridUnitType.Star) }); _gridBackground.Children.Add(gridInputArea); Grid.SetRow(gridInputArea, 1); // If we have some text, add it to the grid if (!string.IsNullOrEmpty(title)) { textTitle = new TextBlock(); textTitle.Text = title; textTitle.TextWrapping = TextWrapping.Wrap; textTitle.Foreground = new SolidColorBrush(Colors.Black); textTitle.FontSize = 25; textTitle.Margin = new Thickness(0, 20, 0, 0); gridInputArea.Children.Add(textTitle); Grid.SetRow(textTitle, 0); Grid.SetColumn(textTitle, 1); } // Add the body text textBody = new TextBlock(); textBody.Text = body; textBody.TextWrapping = TextWrapping.Wrap; textBody.Foreground = new SolidColorBrush(Colors.Black); textBody.FontSize = 20; textBody.Margin = new Thickness(0, 20, 0, 20); gridInputArea.Children.Add(textBody); Grid.SetRow(textBody, 1); Grid.SetColumn(textBody, 1); // Create a textbox for the user to enter text into _textboxInput = new TextBox(); _textboxInput.HorizontalAlignment = HorizontalAlignment.Stretch; _textboxInput.VerticalAlignment = VerticalAlignment.Stretch; _textboxInput.Height = 20; _textboxInput.Background = new SolidColorBrush(Colors.White); _textboxInput.Text = initialValue; _textboxInput.KeyDown += textboxInput_KeyDown; gridInputArea.Children.Add(_textboxInput); Grid.SetRow(_textboxInput, 2); Grid.SetColumn(_textboxInput, 1); // The final row of the popup is occupied by a StackPanel inside which the buttons are displayed stackButtons = new StackPanel(); stackButtons.Orientation = Orientation.Horizontal; stackButtons.HorizontalAlignment = HorizontalAlignment.Right; stackButtons.Margin = new Thickness(0, 20, 0, 20); gridInputArea.Children.Add(stackButtons); Grid.SetRow(stackButtons, 3); Grid.SetColumn(stackButtons, 1); // Add the OK button... _buttonOK = new Button(); _buttonOK.Content = "OK"; _buttonOK.Padding = new Thickness(0, 5, 0, 5); _buttonOK.Width = 110; _buttonOK.Foreground = new SolidColorBrush(Windows.UI.Color.FromArgb(255, 30, 30, 30)); _buttonOK.Click += buttonOption_Click; stackButtons.Children.Add(_buttonOK); // ...and the Cancel button _buttonCancel = new Button(); _buttonCancel.Content = "Cancel"; _buttonCancel.Padding = new Thickness(0, 5, 0, 5); _buttonCancel.Width = 110; _buttonCancel.Foreground = new SolidColorBrush(Windows.UI.Color.FromArgb(255, 30, 30, 30)); _buttonCancel.Click += buttonOption_Click; stackButtons.Children.Add(_buttonCancel); // Add the whole grid to the game page _parent.Children.Add(_gridBackground); // Set focus into the input field _textboxInput.Focus(FocusState.Programmatic); _textboxInput.SelectionStart = _textboxInput.Text.Length; // Indicate that the input panel is now visible KeyboardInputIsVisible = true; }
public bool ShowKeyboardInput() { if (IsXAML) { // RunAsync all of the UI info. dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { // Create a TextBox that will be added to our view but hidden hiddenKeyInput = new Windows.UI.Xaml.Controls.TextBox(); hiddenKeyInput.Opacity = 0; // We will only be generating one character at a time and does not // matter about the font. All we need is the text. hiddenKeyInput.Width = 1; hiddenKeyInput.Height = 1; hiddenKeyInput.MaxWidth = 1; // Create an input scope for us. Probably not needed var scope = new Windows.UI.Xaml.Input.InputScope(); var name = new Windows.UI.Xaml.Input.InputScopeName(); name.NameValue = Windows.UI.Xaml.Input.InputScopeNameValue.Default; scope.Names.Add(name); hiddenKeyInput.InputScope = scope; // Set spell checking off. hiddenKeyInput.IsSpellCheckEnabled = false; // Add our hidden TextBox to our panel content.Children.Add(hiddenKeyInput); // InputPane does not work in this scenario // We need to listen to GotFocus and LostFocus Events hiddenKeyInput.GotFocus += OnGotFocus; hiddenKeyInput.LostFocus += OnLostFocuc; // Hook up our key delegates hiddenKeyInput.KeyDown += OnKeyDown; hiddenKeyInput.KeyUp += OnKeyUp; // enable us and set focus hiddenKeyInput.IsEnabled = true; hiddenKeyInput.Focus(Windows.UI.Xaml.FocusState.Programmatic); } ); } else { } return true; }
/// <summary> /// Preforms the selected edit type on the text box given. /// </summary> /// <param name="textBox"></param> /// <param name="editType"></param> public static void DoEdit(TextBox textBox, VisualHelperTypes editType) { // First refocus the text box since the user clicked a button. // We need to do this quickly so the virt keyboard doesn't move. textBox.Focus(FocusState.Programmatic); // Get some vars int selStart = textBox.SelectionStart; int selLength = textBox.SelectionLength; string curText = textBox.Text; string insertNewLine = null; string insertAtEnd = null; bool isLink = false; bool hasExampleText = false; // Depending on the type see what we can do. switch (editType) { case HelperControls.VisualHelperTypes.Bold: if (selLength != 0) { // Wrap the selected text textBox.Text = curText.Insert(selStart + selLength, "**").Insert(selStart, "**"); } else { // Or add to the end insertAtEnd = $"**{c_exampleText}**"; hasExampleText = true; } break; case HelperControls.VisualHelperTypes.Italic: if (selLength != 0) { // Wrap the selected text textBox.Text = curText.Insert(selStart + selLength, "*").Insert(selStart, "*"); } else { // Or add to the end insertAtEnd = $"*{c_exampleText}*"; hasExampleText = true; } break; case HelperControls.VisualHelperTypes.Link: if (selLength != 0) { // Wrap the selected text textBox.Text = curText.Insert(selStart + selLength, $"]({c_exampleUrl})").Insert(selStart, "["); } else { // Or add to the end insertAtEnd = $"[{c_exampleText}]({c_exampleUrl})"; } isLink = true; break; case HelperControls.VisualHelperTypes.NewLine: int injectPos = selStart; // Inject the new line at the current pos textBox.Text = curText.Insert(injectPos, " \r\n"); // Move the selection to the end of insert textBox.SelectionStart = injectPos + 3; break; case HelperControls.VisualHelperTypes.Quote: insertNewLine = "> "; break; case HelperControls.VisualHelperTypes.List: insertNewLine = "* "; break; case HelperControls.VisualHelperTypes.NumberedList: insertNewLine = "1. "; break; case HelperControls.VisualHelperTypes.Code: insertNewLine = " "; break; } // If the insert on new line is not null we need to find the last new line and // insert the text. if (insertNewLine != null) { // Search for a new line. int searchStart = selStart == curText.Length ? selStart - 1 : selStart; int indexLastNewLine = curText.LastIndexOf('\n', searchStart); // Insert the text textBox.Text = curText.Insert(indexLastNewLine + 1, insertNewLine); // Move the cur to the end. textBox.SelectionStart = indexLastNewLine + 1 + insertNewLine.Length; } // If this isn't null we have something to add at the end of the current text. if (insertAtEnd != null) { // If the last char isn't a space add one. if (textBox.Text.Length > 0 && !Char.IsWhiteSpace(textBox.Text[textBox.Text.Length - 1])) { textBox.Text += ' '; } textBox.Text += insertAtEnd; textBox.SelectionStart = textBox.Text.Length; } // If we added a link try to select the example url if (isLink) { int urlStart = textBox.Text.IndexOf(c_exampleUrl); if(urlStart != -1 && textBox.Text.Length > urlStart + c_exampleUrl.Length) { // +7 -7 so we don't selected the http:// textBox.SelectionStart = urlStart + 7; textBox.SelectionLength = c_exampleUrl.Length - 7; } } // If we have example text try to select it if (hasExampleText) { // Note we could accidentally select the word "example" anywhere in the text box... // but that's ok for now. int exampleStart = textBox.Text.IndexOf(c_exampleText); if (exampleStart != -1 && textBox.Text.Length > exampleStart + c_exampleText.Length) { textBox.SelectionStart = exampleStart; textBox.SelectionLength = c_exampleText.Length; } } }
/// <summary> /// Generates a new task panel /// </summary> /// <param name="cl">Class to generate it for</param> /// <param name="parent">ListView associated with the class</param> /// <param name="task">Task to add</param> /// <returns>A new ListViewItem for the task</returns> public static ListViewItem GenerateTaskPanel(Class cl, ListView parent, Task task) { #region Containers // Create the content area Grid content = new Grid { Margin = new Thickness(0), Height = 75, Background = MainPage.LightGrayBrush, Tag = "Task" }; // Create the list of content items and a delegate to add them to the list List<UIElement> contentItems = new List<UIElement>(); Action<UIElement> registerItem = i => { contentItems.Add(i); }; // The main ListViewItem ListViewItem panel = new ListViewItem { Background = MainPage.TransparentBrush, Margin = new Thickness(0, 0, 0, 5), Height = 75, Tag = false, // Is Panel Expanded HorizontalContentAlignment = HorizontalAlignment.Stretch, VerticalContentAlignment = VerticalAlignment.Top, Padding = new Thickness(0), BorderBrush = MainPage.MediumGrayBrush, BorderThickness = new Thickness(1), }; #endregion #region Title // Task title TextBlock title = new TextBlock { Text = task.Title.Trim(), TextAlignment = TextAlignment.Left, FontSize = 25, Foreground = MainPage.BlueBrush, Margin = new Thickness(5, 0, 0, 0) }; // Sizing title.Measure(new Size(0, 0)); title.Arrange(new Rect(0, 0, 0, 0)); registerItem(title); #endregion #region Finish Button // The check mark that marks the task as completed Button finish = new Button { FontFamily = Icons.IconFont, Content = task.Complete == 1 ? Icons.Cancel : Icons.Accept, Margin = new Thickness(title.ActualWidth + 5, 5, 0, 0), HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, Background = MainPage.TransparentBrush }; // Remove the task when the button is pressed finish.Tapped += (sender, args) => { TaskList.RemoveTask(cl, parent, panel, task); }; registerItem(finish); #endregion #region Info Box // Info box TextBox info = new TextBox { TextAlignment = TextAlignment.Left, Foreground = new SolidColorBrush(Color.FromArgb(255, 50, 50, 50)), HorizontalAlignment = HorizontalAlignment.Left, TextWrapping = TextWrapping.Wrap, BorderThickness = new Thickness(0), AcceptsReturn = true, Width = parent.Width / 3 + 25, Tag = false, // Edit mode IsReadOnly = true, // Edit mode property Background = MainPage.TransparentBrush, // Edit mode property IsHitTestVisible = false // Edit mode property }; // Add the text - only works if you append each character foreach (char c in task.Info) { info.Text += c.ToString(); } // Border around the info box Border infoBorder = new Border { Child = info, Background = MainPage.MediumGrayBrush, Margin = new Thickness(5, 36, 0, 7), HorizontalAlignment = HorizontalAlignment.Left, BorderThickness = new Thickness(0), Padding = new Thickness(0) }; registerItem(infoBorder); // Edit button for the info box Button edit = new Button { FontFamily = Icons.IconFont, Content = Icons.Edit, Width = 20, Height = 20, FontSize = 10, Padding = new Thickness(0), Background = MainPage.TransparentBrush, VerticalAlignment = VerticalAlignment.Bottom, HorizontalAlignment = HorizontalAlignment.Left, Margin = new Thickness(parent.Width / 3 + 10, 36, 0, 7) }; // Toggles edit mode for the info box edit.Click += (sender, args) => { if (!(bool) info.Tag) { info.Tag = true; edit.Content = Icons.Save; info.IsReadOnly = false; info.Background = new SolidColorBrush(Colors.White); info.IsHitTestVisible = true; info.Focus(FocusState.Pointer); info.SelectionStart = info.Text.Length; info.SelectionLength = 0; } else { info.Tag = false; edit.Content = Icons.Edit; info.IsReadOnly = true; info.Background = MainPage.MediumGrayBrush; info.IsHitTestVisible = false; DataHandler.EditTask(task.Id, "Info", info.Text); } }; registerItem(edit); #endregion #region Circular Progress Bar // Progress bar background (gray) CircularProgressBar progressBack = new CircularProgressBar { Percentage = 100, SegmentColor = MainPage.MediumGrayBrush, Radius = 30, StrokeThickness = 5, HorizontalAlignment = HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(0, 2.75, 2.75 + 30, 0) }; registerItem(progressBack); // Progress bar foreground (blue) CircularProgressBar progressFront = new CircularProgressBar { Percentage = 0, SegmentColor = MainPage.BlueBrush, Radius = 30, StrokeThickness = 5, HorizontalAlignment = HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(0, 2.75, 2.75 + 30, 0), Transitions = new TransitionCollection() }; registerItem(progressFront); // Text inside the progress bar that shows the time remaining TextBlock timeLeft = new TextBlock { HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center, Text = string.Empty, FontSize = 12, Foreground = MainPage.BlueBrush, TextAlignment = TextAlignment.Center }; // Helps with alignment for the progress bar Border border = new Border { BorderBrush = MainPage.BlueBrush, BorderThickness = new Thickness(0), Child = timeLeft, Height = 70, Width = 70, HorizontalAlignment = HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Top, Margin = progressFront.Margin }; registerItem(border); // Delegate for Action updateProgress = () => { // Clamp the progress to 100% progressFront.Percentage = Math.Min(Util.GetPercentTime(task) * 100, 100); // Finished tasks get an orange color bool finished = false; if (progressFront.Percentage.Equals(100.0)) { finished = true; progressFront.SegmentColor = MainPage.OrangeRedBrush; timeLeft.Foreground = MainPage.OrangeRedBrush; } // Set the new text timeLeft.Text = $"{Util.GetTimeString(task)}{(finished ? " ago" : string.Empty)}"; }; updateProgress(); // Update the progress every second ThreadPoolTimer.CreatePeriodicTimer( async poolTimer => { await progressFront.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { updateProgress(); }); }, new TimeSpan(0, 0, 0, 1)); #endregion #region Assigned/Due Times // Assigned/due info RichTextBlock timeInfo = new RichTextBlock { FontSize = 14, Margin = new Thickness(-5), TextAlignment = TextAlignment.Center, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Stretch, TextWrapping = TextWrapping.NoWrap }; // "Assigned on" and "Due on" text // Separated with different colors Run assignedText = new Run { Text = "Assigned: ", Foreground = MainPage.BlueBrush }; Run assignedDate = new Run { Text = $"{task.AssignedOn}", Foreground = MainPage.GreenBrush }; Run dueText = new Run { Text = "Due: ", Foreground = MainPage.BlueBrush }; Run dueDate = new Run { Text = $"{task.DueOn}", Foreground = MainPage.OrangeRedBrush }; // Set up lines Paragraph p1 = new Paragraph(); p1.Inlines.Add(assignedText); p1.Inlines.Add(assignedDate); Paragraph p2 = new Paragraph(); p2.Inlines.Add(dueText); p2.Inlines.Add(dueDate); // Add the info to the text box timeInfo.Blocks.Add(p1); timeInfo.Blocks.Add(p2); // Container for time info Border timeInfoBorder = new Border { Child = timeInfo, BorderBrush = MainPage.BlueBrush, BorderThickness = new Thickness(0), Margin = new Thickness(parent.Width / 3 + 35, 36, 105, 5), Padding = new Thickness(0), VerticalAlignment = VerticalAlignment.Stretch }; registerItem(timeInfoBorder); #endregion #region Expand Button // Button that expands the box Button expand = new Button { HorizontalAlignment = HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Top, Height = 73, Width = 25, Margin = new Thickness(0, 0, 0, 0), Content = Icons.Down, FontFamily = Icons.IconFont, Padding = new Thickness(0) }; // This makes sure all other task panels collapse smoothly if a new one is opened expand.Tapped += (sender, args) => { // Get the new height based on the tag that tells you if the panel is open or closed int to = !(bool) panel.Tag ? 412 : 75; // Set the new button content to the opposite arrow expand.Content = !(bool) panel.Tag ? Icons.Up : Icons.Down; // If the panel is not opened if (!(bool) panel.Tag) { // For each task that is open and has content foreach (ListViewItem item in parent.Items.Cast<ListViewItem>() .Where(item => (bool?) item.Tag ?? false && item.Content != null)) { // If the grid content is not null and the grid tag is not null if (!((item.Content as Grid)?.Tag as bool? ?? false)) { // Find the button in the grid that has the Up icon foreach (Button btn in (item.Content as Grid).Children.OfType<Button>() .Where(btn => (string) btn.Content == Icons.Up)) { // ... And change it to the down icon btn.Content = Icons.Down; } // Collapse the panel Util.CreateAnimation(150, item, null, 75, "Height").Begin(); // Set the tag to false indicating the panel is closed item.Tag = false; } } } // Once all other panels have been collapsed, expand the new one Util.CreateAnimation(150, panel, null, to, "Height").Begin(); // Set its tag appropriately panel.Tag = !(bool) panel.Tag; }; registerItem(expand); #endregion #region Calendar // Calendar showing date assigned, date due, today CalendarView calendar = new CalendarView { HorizontalAlignment = HorizontalAlignment.Stretch, VerticalAlignment = VerticalAlignment.Top, SelectionMode = CalendarViewSelectionMode.None, BlackoutForeground = new SolidColorBrush(Colors.White), Background = MainPage.MediumGrayBrush, CalendarItemBackground = MainPage.TransparentBrush, BorderBrush = MainPage.TransparentBrush, CalendarItemBorderBrush = MainPage.TransparentBrush, OutOfScopeBackground = MainPage.TransparentBrush, OutOfScopeForeground = new SolidColorBrush(Colors.Gray), Margin = new Thickness(parent.Width / 3 + 35, 75, 3, 5), }; // Override item rendering to change colors calendar.CalendarViewDayItemChanging += (sender, args) => { if (args.Item == null) { return; } DateTime day = args.Item.Date.DateTime; if (day.Date == DateTime.Parse(task.AssignedOn.ToString()).Date) { args.Item.Background = MainPage.GreenBrush; args.Item.IsBlackout = true; // Hack to change the foreground color } else if (day.Date == DateTime.Parse(task.DueOn.ToString()).Date) { args.Item.Background = MainPage.OrangeRedBrush; args.Item.IsBlackout = true; } if (day.Date == DateTime.Today) { args.Item.IsBlackout = false; } }; calendar.SetDisplayDate(DateTime.Today); registerItem(calendar); #endregion #region Sizing and Creation // Sizing parent.SizeChanged += (sender, args) => { info.Width = args.NewSize.Width / 3 + 25; edit.Margin = new Thickness(args.NewSize.Width / 3 + 10, 36, 0, 7); calendar.Margin = new Thickness(args.NewSize.Width / 3 + 35, 75, 3, 5); timeInfoBorder.Margin = new Thickness(args.NewSize.Width / 3 + 35, 36, 105, 5); }; panel.SizeChanged += (sender, args) => { content.Height = args.NewSize.Height; }; // Add each element in the contentItems list foreach (UIElement element in contentItems) { content.Children.Add(element); } // Set the container content panel.Content = content; return panel; #endregion }
/// <summary> /// Preforms the selected edit type on the text box given. /// </summary> /// <param name="textBox"></param> /// <param name="editType"></param> public static void DoEdit(TextBox textBox, VisualHelperTypes editType) { // First refocus the text box since the user clicked a button. // We need to do this quickly so the virt keyboard doesn't move. textBox.Focus(FocusState.Programmatic); // Get some vars int selStart = textBox.SelectionStart; int selLength = textBox.SelectionLength; int newLineSelOffset = 0; string curText = textBox.Text; string insertNewLine = null; string insertAtEnd = null; bool isLink = false; bool hasExampleText = false; // For some reason the SelectionStart count /r/n as 1 instead of two. So add one for each /r/n we find. for(int count = 0; count < selStart + newLineSelOffset; count++) { if(curText[count] == '\r' && count + 1 < curText.Length && curText[count + 1] == '\n') { newLineSelOffset++; } } // Depending on the type see what we can do. switch (editType) { case HelperControls.VisualHelperTypes.Bold: if (selLength != 0) { // Wrap the selected text textBox.Text = curText.Insert(selStart + newLineSelOffset + selLength, "**").Insert(selStart + newLineSelOffset, "**"); } else { // Or add to the end insertAtEnd = $"**{c_exampleText}**"; hasExampleText = true; } break; case HelperControls.VisualHelperTypes.Italic: if (selLength != 0) { // Wrap the selected text textBox.Text = curText.Insert(selStart + newLineSelOffset + selLength, "*").Insert(selStart + newLineSelOffset, "*"); } else { // Or add to the end insertAtEnd = $"*{c_exampleText}*"; hasExampleText = true; } break; case HelperControls.VisualHelperTypes.Link: if (selLength != 0) { // Wrap the selected text textBox.Text = curText.Insert(selStart + newLineSelOffset + selLength, $"]({c_exampleUrl})").Insert(selStart + newLineSelOffset, "["); } else { // Or add to the end insertAtEnd = $"[{c_exampleText}]({c_exampleUrl})"; } isLink = true; break; case HelperControls.VisualHelperTypes.NewLine: int injectPos = selStart + newLineSelOffset; // Inject the new line at the current pos textBox.Text = curText.Insert(injectPos, " \r\n"); // Move the selection to the end of insert textBox.SelectionStart = injectPos + 3 - newLineSelOffset; break; case HelperControls.VisualHelperTypes.Quote: insertNewLine = "> "; break; case HelperControls.VisualHelperTypes.List: insertNewLine = "* "; break; case HelperControls.VisualHelperTypes.NumberedList: insertNewLine = "1. "; break; case HelperControls.VisualHelperTypes.Code: insertNewLine = " "; break; } // If the insert on new line is not null we need to find the last new line and // insert the text. if (insertNewLine != null) { // Search for a new line. int offsetSelStart = selStart + newLineSelOffset; int searchStart = offsetSelStart == curText.Length ? offsetSelStart - 1 : offsetSelStart; // Try to find it the new line before the cursor int indexLastNewLine = curText.LastIndexOf('\n', searchStart); // We need to make sure there are two new lines before this block int searchNewlineCount = indexLastNewLine - 1; while (searchNewlineCount > 0) { // If we find an /r just move on. if(curText[searchNewlineCount] == '\r') { searchNewlineCount--; continue; } // If we find an /n we are good. else if (curText[searchNewlineCount] == '\n') { break; } // If it is anything else we need to add it. else { insertNewLine = "\r\n" + insertNewLine; break; } } // Insert the text textBox.Text = curText.Insert(indexLastNewLine + 1, insertNewLine); // If where we ended up inserting was after where the selection was move it to the end. if(indexLastNewLine == -1 || (offsetSelStart + insertNewLine.Length) < indexLastNewLine) { textBox.SelectionStart = offsetSelStart - newLineSelOffset + insertNewLine.Length; } else { // If not move it back to where it was + our what we inserted. textBox.SelectionStart = selStart + insertNewLine.Length; } } // If this isn't null we have something to add at the end of the current text. if (insertAtEnd != null) { // If the last char isn't a space add one. if (textBox.Text.Length > 0 && !Char.IsWhiteSpace(textBox.Text[textBox.Text.Length - 1])) { textBox.Text += ' '; } textBox.Text += insertAtEnd; textBox.SelectionStart = textBox.Text.Length; } // If we added a link try to select the example url if (isLink) { int urlStart = textBox.Text.LastIndexOf(c_exampleUrl); if(urlStart != -1 && textBox.Text.Length > urlStart + c_exampleUrl.Length) { // +7 -7 so we don't selected the http:// textBox.SelectionStart = urlStart + 7 - newLineSelOffset; textBox.SelectionLength = c_exampleUrl.Length - 7; } } // If we have example text try to select it if (hasExampleText) { // Note we could accidentally select the word "example" anywhere in the text box... // but that's ok for now. int exampleStart = textBox.Text.LastIndexOf(c_exampleText); if (exampleStart != -1 && textBox.Text.Length > exampleStart + c_exampleText.Length) { textBox.SelectionStart = exampleStart - newLineSelOffset; textBox.SelectionLength = c_exampleText.Length; } } }
/// <summary> /// Shows the dialog. It takes <see cref="InputDialogViewModel"/> to populate the system dialog. It also sets the first command to be /// the default and last one to be the cancel command. /// </summary> /// <param name="viewType"> Type of dialog control. </param> public async void Show(Type viewType) { this.Initialize(); var dialog = new ContentDialog { Title = this.ViewModel.ActivationData.Title, MaxWidth = Window.Current.CoreWindow.Bounds.Width }; var panel = new StackPanel(); panel.Children.Add(new TextBlock { Text = this.ViewModel.ActivationData.Message, TextWrapping = TextWrapping.Wrap, Margin = new Thickness(0, 6, 0, 12) }); var tb = new TextBox { Text = this.ViewModel.ActivationData.Text }; panel.Children.Add(tb); var primaryText = this.ViewModel.ActivationData.Commands.FirstOrDefault() ?? "Ok"; var secondaryText = this.ViewModel.ActivationData.Commands.Skip(1).FirstOrDefault() ?? string.Empty; var returnValue = secondaryText; tb.KeyUp += (sender, args) => { if (args.Key == VirtualKey.Enter) { returnValue = primaryText; dialog.Hide(); } }; dialog.Content = panel; dialog.PrimaryButtonText = primaryText; dialog.SecondaryButtonText = secondaryText; tb.SelectionStart = tb.Text.Length; tb.Focus(FocusState.Programmatic); try { this.dialogTask = dialog.ShowAsync(); var result = await this.dialogTask; var resultValue = string.Empty; this.dialogTask = null; switch (result) { case ContentDialogResult.None: resultValue = returnValue; break; case ContentDialogResult.Primary: resultValue = primaryText; break; case ContentDialogResult.Secondary: resultValue = secondaryText; break; } await this.NavigationService.GoBackAsync(new InputDialogResult(resultValue, tb.Text)); } catch (TaskCanceledException ex) { // Happens when you call nanavigationSerivce.GoBack(...) while the dialog is still open. } }