Внимание на TextBox в DataTemplate

Plone использует Python 2.7.x до версии 5.1. В Plone 5.2 у вас будет возможность запускать Plone под Python 3, но тогда вам придется использовать WSGI-сервер вместо ZServer. Пока просто используйте Plone 5.1 с Python 2.7, так как Plone 5.2 все еще не выпущен окончательно.

9
задан Dave Clemmer 9 October 2013 в 02:45
поделиться

2 ответа

Так как Вы знаете название TextBox Вы хотите сфокусироваться, это становится относительно легким. Идея состоит в том, чтобы овладеть шаблоном, поскольку это относилось ListBoxItem самостоятельно.

Первая вещь, которую Вы хотите сделать, получают выбранный пункт:

var item = listBox1.ItemContainerGenerator.ContainerFromItem(listBox1.SelectedItem) as ListBoxItem;

Затем можно передать это в эту небольшую функцию помощника, которая фокусирует управление на основе его имени:

public void FocusItem(ListBoxItem item, string name)
{
    if (!item.IsLoaded)
    {
        // wait for the item to load so we can find the control to focus
        RoutedEventHandler onload = null;
        onload = delegate
        {
            item.Loaded -= onload;
            FocusItem(item, name);
        };
        item.Loaded += onload;
        return;
    }

    try
    {
        var myTemplate = FindResource("MyTemplateKey") as FrameworkTemplate; // or however you get your template right now

        var ctl = myTemplate.FindName(name, item) as FrameworkElement;
        ctl.Focus();
    }
    catch
    {
        // focus something else if the template/item wasn't found?
    }
}

Я предполагаю, что хитрый бит удостоверяется, что Вы ожидаете объекта для загрузки. Я должен был добавить, что код, потому что я называл это от ItemContainerGenerator.StatusChanged событие и иногда ListBoxItem не был полностью инициализирован к тому времени, когда мы ввели метод.

9
ответ дан 4 December 2019 в 07:24
поделиться

Я знаю, что это устарело, но сегодня я столкнулся с этой проблемой и в конце концов пришел к следующему решению:

Поскольку TextBox загружается только при выборе элемента, и именно тогда вы хотите установить фокус, вы можете просто обработать событие TextBox.Load и вызвать Focus () .

Есть два способа добиться этого.

1. Замените TextBox в DataTemplate на AutoFocusTextBox .

public class AutoFocusTextBox : TextBox
{
    public AutoFocusTextBox()
    {
        Loaded += delegate { Focus(); }; 
    }
}

Не забывайте, что вам нужно будет сослаться на пространство имен, в котором AutoFocusTextBox определен в вашем файле .xaml.

2. Добавьте обработчик в программный код файла, в котором определен DataTemplate .

SomeResourceDictionary.xaml

<TextBox Text="{Binding Something, Mode=TwoWay}" Style={StaticResource ...
        Loaded="FocusTextBoxOnLoad" />

SomeResourceDictionary.xaml.cs

    private void FocusTextBoxOnLoad(object sender, RoutedEventArgs e)
    {
        var textbox = sender as TextBox;
        if(textbox == null) return;
        textbox.Focus();
    }

В любом случае вы всегда можете добавить другое поведение в обработчике, например выделение всего текста.

12
ответ дан 4 December 2019 в 07:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: