- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们有一个问题,即我们的用户控件是根据用户在使用我们的控件时在 XAML 中设置的内容进行初始化的。目前,我们正在使用“已加载”事件来根据用户设置或未设置的内容采取行动。
但是,使用 Loaded 事件的问题是此控件的另一个兄弟正在使用他们的加载事件来设置我们的东西,自从我们的 Loaded 事件尚未触发。 (如果你愿意的话,这是一个 UI 竞争条件。)
同样,我们不能将代码移至构造函数,因为 WPF 系统尚未设置控件使用者的 XAML 指定的属性。由于上述原因,我们不能使用 Loaded 事件。初始化似乎也不起作用。
我也研究过 ISupportsInitialize,但那是我们将批量设置控件属性的地方,而不是外部的东西,所以这似乎也不合适。
想法?
后来我发现这是 UserControls 特有的异常现象。他们以不同的方式处理初始化。您可以在我的后续问题中找到更多详细信息...
...但是在构造函数中调用 InitializeComponent 的简短版本实际上引发了 Initialized 事件,但是在实际设置 XAML 定义的属性之前就这样做了。将其注释掉,现在当 Initialized 触发时设置属性,但当然您的控件的 UI 没有加载!实际上有点令人沮丧。
仍在寻找解决方案。可以在那里找到代码示例和更多详细信息。
最佳答案
[从我的另一个问题复制我的答案 here .]
很棒的香肠!我想通了!
通常,当您收到 Initialized
事件(或在 OnInitialized
覆盖内)时,您可以访问 XAML 设置的属性值。但是,UserControl
类的工作方式略有不同,因为它们依赖于调用 InitializeComponent
来混合 UI 并设置相关的成员变量等。
问题是调用是在构造函数中进行的,它最终会调用 OnInitialized
(并因此引发 Initialized
事件),但这发生在 XAML-已应用设置属性,这意味着您还无法访问它们,而我需要这些。
人们可能认为这对 Loaded
事件来说是一个很好的用途——根据这些属性完成初始化——但是如果你在那里执行额外的初始化,你就会创建一个潜在的竞争条件与您的消费者之间的关系在于,如果他们订阅您的 Loaded
事件并在您之前获得它,然后在他们的处理程序中尝试访问您的控件,他们将访问一个未初始化的控件。
然后我想到了一些事情...正如我在上面展示的那样,如果您从构造函数中删除 InitializeComponent
调用,Initialized
事件现在将按您预期的方式工作,但是当然你的 UI 还没有水合,因为你还没有调用 InitializeComponent
。
如果您将该调用移动到 OnInitialized
覆盖的开头,在调用 base.OnInitialized
之前,因此在 Initialized 之前,会发生什么
事件被引发?
是的!成功了! :)
这样您不仅拥有 XAML 设置的属性,而且在任何人获得 Initialized
事件(更不用说 Loaded
事件),这就是应该如何使用 Initialized
事件。
下面是修改后的代码...
public partial class TestControl : UserControl
{
protected override void OnInitialized(EventArgs e)
{
InitializeComponent();
base.OnInitialized(e);
}
public static readonly DependencyProperty TestValueProperty = DependencyProperty.Register(
"TestValue",
typeof(string),
typeof(TestControl),
new UIPropertyMetadata("Original Value"));
public string TestValue
{
get { return (string)GetValue(TestValueProperty); }
set { SetValue(TestValueProperty, value); }
}
}
InitializeComponent
之前,您无法通过名称访问组成控件,但这仅意味着您必须计划在 InitializeComponent< 之间移动此类基于名称的初始化
和对 base.OnInitialize
的调用,一切都会正常进行。关于c# - 专门针对用户控件,在构造函数之后但在 Loaded 事件之前是否有一个地方可以访问 XAML 中设置的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18580352/
我正在尝试将 WPF CodeBehid 事件(如 Event、Handler、EventSetter)转换为 MVVM 模式。我不允许使用 System.Windows.Controls,因为我使用
我可能误解了 Backbone 中的事件系统,但是当我尝试以下代码时什么也没有发生。当我向 Backbone.Events 扩展对象添加新属性时,它不应该触发某种更改、更新或重置事件吗?就像模型一样吗
我遇到了一个简单的问题,就是无法弄清楚为什么它不起作用。我有一个子组件“app-buttons”,其中我有一个输入字段,我想听,所以我可以根据输入值过滤列表。 如果我将输入放在我有列表的根组件中,一切
System.Timers.Timer 的 Elapsed 事件实际上与 System.Windows.Forms.Timer 的 Tick 事件相同吗? 在特定情况下使用其中一种比使用另一种有优势吗
嗨,这个 javascript 代码段是什么意思。(evt) 部分是如此令人困惑.. evt 不是 bool 值。这个怎么运作? function checkIt(evt) { evt
我正在使用jquery full calendar我试图在事件被删除时保存它。 $('calendar').fullCalendar ({
我有两个链接的鼠标事件: $('body > form').on("mousedown", function(e){ //Do stuff }).on("mouseup", function(
这是我的代码: $( '#Example' ).on( "keypress", function( keyEvent ) { if ( keyEvent.which != 44 ) {
我尝试了 dragOver 事件处理程序,但它没有正常工作。 我正在研究钢琴,我希望能够弹奏音符,即使那个键上没有发生鼠标按下。 是否有事件处理程序? 下面是我正在制作的钢琴的图片。 最佳答案 您应该
当悬停在相邻文本上时,我需要使隐藏按钮可见。这是通过 onMouseEnter 和 onMouseLeave 事件完成的。但是当点击另外的文本时,我需要使按钮完全可见并停止 onMouseLeave
我有ul标签内 div标签。我申请了mouseup事件 div标记和 click事件 ul标签。 问题 每当我点击 ul标签,然后都是 mouseup和 click事件被触发。 我想要的是当我点击 u
我是 Javascript 和 jQuery 的新手,所以我有一个非常愚蠢的疑问,请耐心等待 $(document).click(function () { alert("!"); v
我有一个邮政编码解析器,我正在使用 keyup 事件处理程序来跟踪输入长度何时达到 5,然后查询服务器以解析邮政编码。但是我想防止脚本被不必要地调用,所以我想知道是否有一种方法可以跟踪 keydown
使用事件 API,我有以下代码来发布带有事件照片的事件 $facebook = new Facebook(array( "appId" => "XXX", "se
首次加载 Microsoft Word 时,既不会触发 NewDocument 事件也不会触发 DocumentOpen 事件。当 Word 实例已打开并打开新文档或现有文档时,这些事件会正常触发。
我发现了很多相关问题(这里和其他地方),但还没有具体找到这个问题。 我正在尝试监听箭头键 (37-40) 的按键事件,但是当以特定顺序使用箭头键时,后续箭头不会生成“按键”事件。 例子: http:/
给定的 HTML: 和 JavaScript 的: var $test = $('#test'); $test.on('keydown', function(event) { if (eve
我是 Node.js 的新手,希望使用流运行程序。对于其他程序,我必须同时启动一个服务器(mongodb、redis 等),但我不知道我是否应该用这个运行一个服务器。请让我知道我哪里出了问题以及如何纠
我正在尝试使用 Swift 和 Cocoa 创建一个适用于 OS X 的应用程序。我希望应用程序能够响应关键事件,而不将焦点放在文本字段上/文本字段中。我在 Xcode 中创建了一个带有 Storyb
我有以下代码: (function(w,d,s,l,i){ w[l]=w[l]||[];w[l].push({
我是一名优秀的程序员,十分优秀!