【发布时间】:2011-09-01 14:34:44
【问题描述】:
在我的一个应用程序中,我遇到了无法解决的性能问题:
应用程序是使用派生自 TextBox 类的输入控件构建的,在 Themes\Generic.xaml 中有自己的 ControlTemplate。
我的问题是,这些控件在不再使用后不会被释放。如果我使用 SciTech MemoryProfiler 查看它们,我会发现它们由 System.Windows.Documents.TextEditor 的实例持有,TextEditor-instance 通过终结器队列持有。
内存分析器将警告附加到 TextEditor-instance,说“实例间接地由终结器队列根植”。
有人知道这里发生了什么吗?不允许直接从TextBox派生吗?还是我忘记了要实施的重要事项?
实施的其他信息:
其中一些派生控件的实现非常简单。在类构造函数中,DefaultStyleKeyProperty 的元数据被覆盖,并且没有事件处理程序附加到控件模板中包含的元素。比如:
public class MyDerivedTextBox : TextBox{
static MyDerivedTextBox(){
DefaultStyleKeyProperty.OverrideMetadata(typeof(MyDerivedTextBox), new FrameworkPropertyMetadata(typeof(MyDerivedTextBox)));
}
}
(简化的)样式看起来像:
<Style TargetType="{x:Type myApp_controls:MyDerivedTextBox}">
<Setter Property="SnapsToDevicePixels" Value="True"/>
<Setter Property="UndoLimit" Value="1"/>
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type myApp_controls:MyDerivedTextBox }">
<Border Name="Border" ... >
<ScrollViewer Margin="1" x:Name="PART_ContentHost" />
</Border>
</Setter.Value>
</Setter>
</Style>
【问题讨论】:
标签: wpf wpf-controls profiling controltemplate