考虑:
someControl.Click += delegate { Foo(); };
Run Code Online (Sandbox Code Playgroud)
事件的论点是无关紧要的,我不需要它们,我对它们不感兴趣.我只想让Foo()被调用.通过反射没有明显的方法来做同样的事情.
我想将上述内容翻译成类似的内容
void Foo() { /* launch missiles etc */ }
void Bar(object obj, EventInfo info)
{
Action callFoo = Foo;
info.AddEventHandler(obj, callFoo);
}
Run Code Online (Sandbox Code Playgroud)
此外,我不想假设传递给Bar的对象类型严格遵守使用事件的EventHander(TArgs)签名的指导原则.简而言之,我正在寻找一种方法来将Action订阅到任何处理程序类型; 不那么简单,一种将Action委托转换为预期处理程序类型的委托的方法.
以下示例xaml使每个选项卡项共享相同的TextBox.这是有道理的,在某种程度上我猜...但它是意想不到的行为,几乎感觉就像一个bug.我在文档中找不到任何解释行为的信息,或者如何正确解决这个问题.
<TabControl>
<TabControl.Resources>
<Style TargetType="TabItem">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBox />
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</TabControl.Resources>
<TabItem Name="tab1" />
<TabItem Name="tab2" />
</TabControl>
Run Code Online (Sandbox Code Playgroud)
当在tab1和tab2之间切换时,使用相同的TextBox,当我期望每个选项卡有一个新的TextBox时.我怎样才能得到后一种情况?
对TabItem进行子类化并将其内容默认设置为TextBox是一种方法,但我只是想确保没有我遗漏的东西.
编辑
我意识到为每个选项卡显式设置内容将解决问题,但选项卡将动态创建.我想使用内容模板,以便我可以通过数据绑定添加新选项卡,并使内容不共享,因为它会导致奇怪的行为.
也许使用TabControl的当前实现,没有声明方法来解决这个问题.在代码中设置内容非常简单,但在WPF中这样的事情总是感觉不对.对我来说,这似乎是TabControl的不合理优化; 对于不实用的情况,它至少应该是可选的.
我从ComboBox派生了一个类,使其成为一个所有者绘制的列表框(DrawMode.OwnerDrawVariable样式),并通过重写OnMeasureItem和OnDrawItem,我将特殊项添加到下拉列表(例如,分隔符)中,它们更小/更大大小比控制中的常规项目大.
现在,我遇到并且似乎无法有效解决的问题是下拉列表的大小调整:当列表下降时,列表末尾有一个丑陋的空白区域.我想我通过设置组合框的所有项目高度的总和的DropDownHeight财产解决这一问题,但是似乎并没有工作,所有的时间.有时,在随机数量的项目上,空白空间的厄运会返回.这是一个不寻常的问题,但希望是一个常见且易于修复的问题.
如何让ComboBox的下拉列表精确调整到其内部项目占用的大小?
.net ×2
c# ×2
combobox ×1
delegates ×1
events ×1
reflection ×1
tabcontrol ×1
winforms ×1
wpf ×1