Plone использует Python 2.7.x до версии 5.1. В Plone 5.2 у вас будет возможность запускать Plone под Python 3, но тогда вам придется использовать WSGI-сервер вместо ZServer. Пока просто используйте Plone 5.1 с Python 2.7, так как Plone 5.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
не был полностью инициализирован к тому времени, когда мы ввели метод.
Я знаю, что это устарело, но сегодня я столкнулся с этой проблемой и в конце концов пришел к следующему решению:
Поскольку 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();
}
В любом случае вы всегда можете добавить другое поведение в обработчике, например выделение всего текста.