Как установить фокус в программно созданном текстовом поле? - PullRequest
3 голосов
/ 12 февраля 2010

Что мне нужно сделать со следующим кодом, чтобы курсор мигал во втором текстовом поле при появлении окна?

XAML:

<Window x:Class="TestFocksdfj.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel HorizontalAlignment="Left" Margin="10">
        <ContentControl x:Name="FormArea"/>
    </StackPanel>
</Window>

Код сзади:

using System.Windows;
using System.Windows.Controls;

namespace TestFocksdfj
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            StackPanel sp = new StackPanel();

            for (int i = 0; i < 3; i++)
            {
                TextBox tb = new TextBox();
                tb.Width = 200;
                tb.Margin = new Thickness { Bottom = 3 };
                if (i == 1)
                    tb.Focus();
                sp.Children.Add(tb);
            }

            FormArea.Content = sp;
        }
    }
}

Ответы [ 3 ]

4 голосов
/ 12 февраля 2010

После того, как вы позвонили FormArea.Content = sp;, вы можете позвонить sp.Children[1].Focus();, чтобы выделить второй текстовый блок.

Как это:

public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            StackPanel sp = new StackPanel();

            for (int i = 0; i < 3; i++)
            {

                TextBox tb = new TextBox();
                tb.Width = 200;
                tb.Margin = new Thickness { Bottom = 3 };
                sp.Children.Add(tb);
            }
            FormArea.Content = sp;
            sp.Children[1].Focus();
        }
    }
1 голос
/ 12 февраля 2010

только что нашел решение на http://apocryph.org/2006/09/10/wtf_is_wrong_with_wpf_focus, которое хорошо работает в моем случае, , но нет ли более стандартного способа сделать это в WPF без такого взлома? using System.Windows; using System.Windows.Controls; using System.Threading; using System; using System.Windows.Input; namespace TestFocksdfj { public partial class Window1 : Window { public Window1() { InitializeComponent(); StackPanel sp = new StackPanel(); for (int i = 0; i < 3; i++) { TextBox tb = new TextBox(); tb.Width = 200; tb.Margin = new Thickness { Bottom = 3 }; if (i == 2) { FocusHelper.Focus(tb); } sp.Children.Add(tb); } FormArea.Content = sp; } } //thanks to: http://apocryph.org/2006/09/10/wtf_is_wrong_with_wpf_focus/ static class FocusHelper { private delegate void MethodInvoker(); public static void Focus(UIElement element) { ThreadPool.QueueUserWorkItem(delegate(Object foo) { UIElement elem = (UIElement)foo; elem.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (MethodInvoker)delegate() { elem.Focus(); Keyboard.Focus(elem); }); }, element); } } }

0 голосов
/ 12 февраля 2010

Вы могли бы подумать, что tb.focus будет всем, что требуется. Вы можете попробовать установить tabindex для второго текстового поля в 0, а затем попробовать tb.focus. Другая альтернатива - это немного JavaScript ...

private void Set_Focus(string controlname)
{
string strScript;

strScript = "<script language=javascript> document.all('" + controlname + "').focus() </script>";
RegisterStartupScript("focus", strScript);
}
...