В одном из моих приложений у меня проблема с производительностью, которую я не могу решить:
Приложение построено с элементами управления вводом, производными от класса TextBox
, имеющими собственный ControlTemplate в Themes\Generic.xaml
.
Моя проблема в том, что эти элементы управления не будут выпущены после того, как они больше не будут использоваться. Если я посмотрю на них с помощью SciTech MemoryProfiler, то увижу, что они удерживаются экземпляром System.Windows.Documents.TextEditor
, а экземпляр TextEditor
удерживается через очередь финализатора.
Профилировщик памяти прикрепляет предупреждение к экземпляру TextEditor
, говоря: «Экземпляр косвенно укоренен очередью финализатора».
Кто-нибудь знает, что здесь происходит? Разве это не разрешено напрямую из 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>