谁在幕后调用 VisualStateManager.GoToState?

Who is calling VisualStateManager.GoToState behind the scenes?

我是 xaml 和 windows 应用程序开发的新手,如果这个问题看起来很愚蠢,我很抱歉。

我创建了一个文本框,在设计器中我右键单击它并选择编辑模板=>编辑一个副本并将其放入我的自定义词典中。

在这个文本框的控件模板中,我看到了禁用、聚焦等视觉状态。我修改了它们和 运行 移动应用程序,发现我的更改就像文本框聚焦时更改边框颜色一样。

但是为了让它起作用,必须有人打电话给

VisualStateManager.GoToState("Focused")

当文本框获得焦点时,谁在调用它,因为我在控件模板中没有看到任何视觉转换,这是怎么发生的?

XAML 是一种编译语言,如果您仔细观察,就会发现在幕后发生的事情是 xaml 后面的 class 与您的 xaml 代码。

这意味着(没有实际用途)编译您的程序会将所有这些 XAML 转换为 C# 代码,然后再转到 MSIL 并最终作为二进制程序执行。

发生的大部分状态更改都是基于事件的,而 TextBox 与所有其他用户控件一样,将传输消息并收听消息。包含 TextBox 的 Page 可能会在其子项之一获得焦点时传输状态更改,并且作为一个好的控件,TextBox 会侦听此事件并对其做出反应。

控件本身中的代码正在调用 VisualStateManager.GoToState(...) 。

当您开始实现自己的自定义控件时,您可能会根据自己的逻辑订阅可用的事件和转换状态。下面是一个自定义控件的示例,它有自己的两个自定义状态。

https://github.com/xyzzer/WinRTXamlToolkit/blob/master/WinRTXamlToolkit/Controls/WatermarkTextBox/WatermarkTextBox.cs