更改按键时的数据模板并将键发送到模板

问题描述 投票:0回答:1

我有一个自定义控件,该控件呈现为数据网格(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,因为模板是直接在单元格中而是在子级之一中呈现的。

以下是我想解决的一些想法

  • 收集按键事件,直到呈现模板,然后将文本框放在编辑模板中,然后将按键事件推送到它上
  • “”以某种方式将渲染放入优先级分配器中,并等待“某时”,直到渲染完成,然后执行GUI操作

有人可以指出正确的方向吗?

c# wpf datatemplate
1个回答
0
投票

我结束了以下内容

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
}

How to simulate a Ctrl A + Ctrl C using keybd_event

© www.soinside.com 2019 - 2024. All rights reserved.