Изменить шаблон данных при нажатии клавиши и отправить ключ в шаблон - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть пользовательский элемент управления, который отображается как ячейка в сетке данных (Infragistics).Все ячейки отображаются с шаблоном только для чтения.Ячейки могут быть выбраны (предоставлено Infragistics).

Теперь, если пользователь нажимает, например, «3», я изменяю шаблон только для чтения на шаблон редактирования.Это прекрасно работает.

Шаблон редактирования содержит текстовое поле, которое должно иметь фокус после, а также получать нажатие клавиши, например.3. Проблема в том, что в то время, когда я получаю нажатие клавиши и меняю шаблон, он, конечно, еще не отображается.

Контроль

public class Cell
{
  //dependency properties
  public DataTemplate ReadOnlyTemplate;
  public DataTemplate EditTemplate;
  public DataTemplate CurrentTemplate;

  OnPreviewKeyDown()
  {
    CurrentTemplate = EditTemplate;
  }
}

Xaml

<Style TargetType="{x:Type local:Cell}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:Cell}">
                <Border BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <ContentControl HorizontalAlignment="Stretch"
                                    VerticalAlignment="Stretch"
                                    Content="{Binding DataContext, RelativeSource={RelativeSource Self}}"
                                    ContentTemplate="{Binding CurrentTemplate, RelativeSource={RelativeSource TemplatedParent}}" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Я не могу использовать OnApplyTemplate, потому что шаблон отображается непосредственно внутри ячейки, но у одного из детей.

Вот некоторые идеи, которые я предложилрешить

  • собирать события нажатия клавиш до тех пор, пока шаблон не будет отрисован, а затем сфокусировать текстовое поле в шаблоне редактирования и вставить в него события нажатия клавиш
  • «каким-то образом» поместить рендеринг вдиспетчер приоритетов и подождите «когда-нибудь», пока он не будет обработан, а затем выполните действия с графическим интерфейсом

Может ли кто-нибудь указать мне правильное направление?

1 Ответ

0 голосов
/ 24 сентября 2019

Я получил следующее:

cell.Dispatcher?.BeginInvoke(DispatcherPriority.Render, new Action(() => OnCellEnteredEditMode(cell)));

private static void OnCellEnteredEditMode(Cell cell)
{
  //traverse through the visual tree of the cell down to the first item which I can set to focus to
  //use win32 API to send key press
}

Как имитировать Ctrl A + Ctrl C с помощью keybd_event

...