我正在寻找一个图表,作为参考,显示事件和覆盖的顺序,这些事件和覆盖调用WPF自定义控件,这些控件派生自通用类,如FrameworkElement,UIElement,Control,ContentControl,Decorator等.
我对控制过程变得可见并准备好与之交互的事件和覆盖特别感兴趣.换句话说,我对这个图表并不感兴趣,这个图表显示了可以处理用户在准备好与之交互后与之交互的事件,例如MouseLeftButtonDown.
我正在寻找的是像这个图(这些图解释了WPF 窗口或应用程序的生命周期),但用于自定义控件.
我也看过这个页面,在我看来这看起来太简单了.该网页似乎基本上说,有大多只是Initialized,Loaded和Unloaded事件.为了说明,我需要在自定义控件中使用的一些常规事件/覆盖包括:
LoadedUnLoadedIsVisibleChangedOnApplyTemplate随着稍微更专业的覆盖,如Popup OnOpened和Expander OnExpanded等.
我遇到的问题是我忘记了什么时候能做的事情VisualStateManager.GoToState(...)(这OnApplyTemplate是我相信的第一个真正的机会).而且我还会发现我需要使用的事件,例如IsVisibleChanged(当用户返回到包含我的控件的Tab时,当我需要一个控件来执行"重新加载/刷新"状态更改时,此事件被证明是必要的) .所以我一直想知道还有其他这样的事件/覆盖,我真的要注意自定义控件吗? 这是一个显示这些事物相互关联的图表的地方.
考虑到这些类型的事件/覆盖,这个Silverlight图表非常接近我正在寻找的,但对于WPF.该帖子上的一些评论者说,WPF的事件/覆盖与Silverlight不同. 如果是这样,你能指点我一个类似的图表吗?
为了进一步说明对这种图的需求,请考虑我在源自ContentControl的自定义控件上目睹的以下事件序列:
Initialized 事件回调叫Loaded 事件回调叫IsVisibleChanged 事件回调叫OnApplyTemplate 覆盖被叫Loaded 事件回调叫Loaded 事件回调再次调用Loaded 事件回调连续第三次调用有时候Border控件或Rectangle控件都能满足我的需求.一个例子是当我实现ControlTemplate并且我已经应用了分层技术(即在网格中堆叠控件),并且我不需要将不同的RadiusX或RadiusY应用于角落.
但是,在设计这样的ControlTemplates时,有时候我最终会使用几个 Borders或Rectangles这样的层.因此,我意识到我应该认识到哪个控件对应用程序的性能影响最小.我看到他们的继承层次结构在FrameworkElement之后出现了分歧.我还注意到Border是一个装饰器控件(我和装饰器一起工作但是我不确定它们相对于其他控件的表现如何).有人可以照亮
1)我们如何能够基于特定的继承层次结构得出关于控件性能影响的一般结论?
2)装饰器(如Border)相对于其他控件如何执行?
3)具体关于Border和Rectangle,哪个表现更好?
在研究如何将您的应用程序连接到 Firebase 模拟器(例如 Firestore 模拟器)时,我发现主要文档说明我们会这样做(Web 版本 9):
import { getFirestore, connectFirestoreEmulator } from "firebase/firestore";
// firebaseApps previously initialized using initializeApp()
const db = getFirestore(); // <-- Notice they don't pass-in firebaseApp here
connectFirestoreEmulator(db, 'localhost', 8080);
Run Code Online (Sandbox Code Playgroud)
我也看到过getFirestore()这样的调用:
import { initializeApp } from 'firebase/app';
import { getFirestore, connectFirestoreEmulator } from 'firebase/firestore';
const config = { /* Firebase project config here */ };
const firebaseApp = initializeApp(config);
const db = getFirestore(firebaseApp); // <-- Notice firebaseApp passed-in
connectFirestoreEmulator(db, 'localhost', 8080); …Run Code Online (Sandbox Code Playgroud) 我们在需要支持IE 8的应用程序中使用Knockout和jQuery(在其他几个浏览器中).我们有一个案例需要对一个元素使用Knockout点击绑定,对另一个元素使用jQuery点击处理程序.但是,我们发现这两种类型的点击处理程序在IE 8中相互冲突(它们在我们所有其他支持的浏览器中可以很好地协同工作).
我们将问题简化为一个简单的可重复的例子.如果您的计算机上没有IE 8,可以通过选择"浏览器模式:IE8"在较新版本的IE中测试它:

使用该设置,您可以在此jsbin中查看冲突.这段代码是:
<html>
<head>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/knockout/knockout-3.0.0.js"></script>
<script type="text/javascript">
$(document).ready(function () {
ko.applyBindings(function () {
var viewModel = new Object();
viewModel.CanViewPage = true;
viewModel.alertA = function () {
alert("A");
};
$('#B').click(function () {
alert("B");
});
return viewModel;
}());
});
</script>
</head>
<body>
<!-- ko if: CanViewPage -->
<span data-bind="click: alertA">A</span>
<span id="B">B</span>
<!-- /ko -->
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
单击"A"时,将显示预期警报.但是,当您单击"B"时,alert("A")会错误地调用:

我们找到了两个解决这个问题的"解决方案",但它们都不适用于我们的应用程序.让这两个点击处理程序同时在IE 8中工作的第一种方法是删除ko if: CanViewPage.这可以在这个jsbin中看到.这个"解决方案"是不可行的,因为它是我们在许多页面上的这个大型应用程序中使用的核心页面视图权限机制.
我们发现的第二个"解决方案"是颠倒导入jQuery和Knockout的脚本标签的顺序.这可以在这个jsbin中看到.这种"解决方案"也不可行,因为这些导入是通过母版页包装器控制的 …