gpt4 book ai didi

c# - 如何在 WPF 中捕获 DataTemplate 的实例化?

转载 作者:行者123 更新时间:2023-11-30 17:29:20 25 4
gpt4 key购买 nike

我有一个搜索窗口,如下所示:

Search window

Condition 和 Options 部分是一个 ContentControl 和多个 DataTemplate,其中包含针对特定字段的不同过滤器形式(例如日期时间选择器等)。

我希望在打开窗口后聚焦 DataTemplate 中的特定控件(如果有人问,这就是 X 问题)

我正在通过以下方式做到这一点:

    public FindWindow(FindModel model)
{
InitializeComponent();

this.viewModel = Dependencies.Container.Instance.Resolve<FindWindowViewModel>(new ParameterOverride("access", this), new ParameterOverride("model", model));
DataContext = viewModel;
FocusInput();
}

FocusInput 执行以下操作:

    public static FrameworkElement GetControlByName(DependencyObject parent, string name)
{
int count = VisualTreeHelper.GetChildrenCount(parent);
for (var i = 0; i < count; ++i)
{
var child = VisualTreeHelper.GetChild(parent, i) as FrameworkElement;
if (child != null)
{
if (child.Name == name)
{
return child;
}
var descendantFromName = GetControlByName(child, name);
if (descendantFromName != null)
{
return descendantFromName;
}
}
}
return null;
}

public void FocusInput()
{
Dispatcher.Invoke(DispatcherPriority.ContextIdle, new Action(() =>
{
var obj = GetControlByName(filterContainer, "input");
if (obj != null && obj is Control ctl)
ctl.Focus();
}));
}

当它在 ctor 中运行时,FindWindow 得到 null obj(尽管 ContentControl 设置了 Content)。但是,当您单击“测试”按钮时,它只会运行 FocusControl,后者会依次找到所需的控件并将其聚焦。

问题是:当 ContentControl 完成实例化 DataTemplate 时,如何捕获时刻,以便我可以捕获所需的控制? (问题 Y)

如果能解决问题 X 或 Y(这是我尝试过的解决方案),我将不胜感激。

最佳答案

在加载窗口或 ContentControl 后尝试调用 FocusInput():

public FindWindow(FindModel model)
{
InitializeComponent();

this.viewModel = Dependencies.Container.Instance.Resolve<FindWindowViewModel>(new ParameterOverride("access", this), new ParameterOverride("model", model));
DataContext = viewModel;
Loaded += (s, e) => FocusInput();
}

关于c# - 如何在 WPF 中捕获 DataTemplate 的实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51307639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com