Skip to content

Commit 39da95b

Browse files
committed
Address memory leaks.
1 parent 93f99f4 commit 39da95b

File tree

6 files changed

+64
-54
lines changed

6 files changed

+64
-54
lines changed

Rubberduck.Core/UI/AddRemoveReferences/AddRemoveReferencesWindow.xaml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -222,10 +222,11 @@
222222
<Button Name="SearchButton" Grid.Column="1" Command="{Binding ClearSearchCommand}"
223223
BorderBrush="{x:Static SystemColors.ControlLightBrush}"
224224
Background="Transparent"
225-
Width="20" Height="20" Padding="0" Margin="0,1"
226-
controls:EventFocusAttachment.ElementToFocus="{Binding ElementName=SearchBox}">
227-
<Image Margin="2" Width="16" Height="16"
228-
Source="{Binding Search, Converter={StaticResource SearchToIcon}, UpdateSourceTrigger=PropertyChanged}" />
225+
Width="20" Height="20" Padding="0" Margin="0,1">
226+
<Image Margin="2" Width="16" Height="16" Source="{Binding Search, Converter={StaticResource SearchToIcon}, UpdateSourceTrigger=PropertyChanged}" />
227+
<i:Interaction.Behaviors>
228+
<controls:FocusElementAfterClickBehavior FocusElement="{Binding ElementName=SearchBox, Mode=OneWay}"/>
229+
</i:Interaction.Behaviors>
229230
</Button>
230231
</Grid>
231232
</Border>

Rubberduck.Core/UI/CodeExplorer/CodeExplorerControl.xaml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -390,9 +390,11 @@
390390
<Button Name="SearchButton" Grid.Column="1" Command="{Binding ClearFilterTextCommand}" IsEnabled="{Binding CanSearch}"
391391
BorderBrush="{x:Static SystemColors.ControlLightBrush}"
392392
Background="Transparent"
393-
Width="20" Height="20" Padding="0" Margin="0,1"
394-
controls:EventFocusAttachment.ElementToFocus="{Binding ElementName=SearchBox}">
393+
Width="20" Height="20" Padding="0" Margin="0,1">
395394
<Image Margin="2" Width="16" Height="16" Source="{Binding FilterText, Converter={StaticResource SearchToIcon}, UpdateSourceTrigger=PropertyChanged}" />
395+
<i:Interaction.Behaviors>
396+
<controls:FocusElementAfterClickBehavior FocusElement="{Binding ElementName=SearchBox, Mode=OneWay}"/>
397+
</i:Interaction.Behaviors>
396398
</Button>
397399
</Grid>
398400
</Border>

Rubberduck.Core/UI/Controls/EventFocusAttachment.cs

Lines changed: 0 additions & 34 deletions
This file was deleted.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using System.Windows;
2+
using System.Windows.Controls;
3+
using System.Windows.Controls.Primitives;
4+
using System.Windows.Input;
5+
using System.Windows.Interactivity;
6+
7+
namespace Rubberduck.UI.Controls
8+
{
9+
//https://stackoverflow.com/a/5161792/4088852
10+
public class FocusElementAfterClickBehavior : Behavior<ButtonBase>
11+
{
12+
private ButtonBase _associatedButton;
13+
14+
protected override void OnAttached()
15+
{
16+
_associatedButton = AssociatedObject;
17+
18+
_associatedButton.Click += AssociatedButtonClick;
19+
}
20+
21+
protected override void OnDetaching()
22+
{
23+
_associatedButton.Click -= AssociatedButtonClick;
24+
}
25+
26+
private void AssociatedButtonClick(object sender, RoutedEventArgs e)
27+
{
28+
Keyboard.Focus(FocusElement);
29+
}
30+
31+
public Control FocusElement
32+
{
33+
get => (Control)GetValue(FocusElementProperty);
34+
set => SetValue(FocusElementProperty, value);
35+
}
36+
37+
// Using a DependencyProperty as the backing store for FocusElement. This enables animation, styling, binding, etc...
38+
public static readonly DependencyProperty FocusElementProperty =
39+
DependencyProperty.Register("FocusElement", typeof(Control), typeof(FocusElementAfterClickBehavior), new UIPropertyMetadata());
40+
}
41+
}

Rubberduck.Core/UI/Inspections/InspectionResultsControl.xaml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -191,12 +191,12 @@
191191
<DataGridTemplateColumn Header="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=CodeInspectionResults_Type}" SortDirection="{Binding}">
192192
<DataGridTemplateColumn.CellTemplate>
193193
<DataTemplate DataType="abstract1:IInspectionResult">
194-
<Image Source="{Binding Inspection, Converter={StaticResource InspectionIconConverter}}" />
194+
<Image Source="{Binding Inspection, Converter={StaticResource InspectionIconConverter}, Mode=OneTime}" />
195195
</DataTemplate>
196196
</DataGridTemplateColumn.CellTemplate>
197197
</DataGridTemplateColumn>
198-
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=CodeInspectionResults_Issue}" Binding="{Binding Description}" />
199-
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=CodeInspectionResults_Location}" Binding="{Binding QualifiedSelection.QualifiedName}" />
198+
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=CodeInspectionResults_Issue}" Binding="{Binding Description, Mode=OneTime}" />
199+
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=CodeInspectionResults_Location}" Binding="{Binding QualifiedSelection.QualifiedName, Mode=OneTime}" />
200200
</DataGrid.Columns>
201201
</controls:GroupingGrid>
202202

@@ -210,12 +210,12 @@
210210
<DataGridTemplateColumn Header="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=CodeInspectionResults_Type}">
211211
<DataGridTemplateColumn.CellTemplate>
212212
<DataTemplate DataType="abstract1:IInspectionResult">
213-
<Image Source="{Binding Inspection, Converter={StaticResource InspectionIconConverter}}" />
213+
<Image Source="{Binding Inspection, Converter={StaticResource InspectionIconConverter}, Mode=OneTime}" />
214214
</DataTemplate>
215215
</DataGridTemplateColumn.CellTemplate>
216216
</DataGridTemplateColumn>
217-
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=CodeInspectionResults_Issue}" Binding="{Binding Description}" />
218-
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=CodeInspectionResults_Location}" Binding="{Binding QualifiedSelection.QualifiedName}" />
217+
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=CodeInspectionResults_Issue}" Binding="{Binding Description, Mode=OneTime}" />
218+
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=CodeInspectionResults_Location}" Binding="{Binding QualifiedSelection.QualifiedName, Mode=OneTime}" />
219219
</DataGrid.Columns>
220220
</controls:GroupingGrid>
221221

Rubberduck.Core/UI/ToDoItems/ToDoExplorerControl.xaml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -528,10 +528,10 @@
528528
SelectedItem="{Binding SelectedItem}"
529529
Visibility="{Binding Path=IsChecked, ElementName=GroupByMarker, Converter={StaticResource BoolToVisibility}}">
530530
<controls:GroupingGrid.Columns>
531-
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.Resources.ToDoExplorer.ToDoExplorerUI, Key=TodoExplorer_Description}" Binding="{Binding Description}" Width="*"/>
532-
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=ProjectName}" Binding="{Binding Selection.QualifiedName.ProjectName}" />
533-
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=ModuleName}" Binding="{Binding Selection.QualifiedName.ComponentName}" />
534-
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.Resources.ToDoExplorer.ToDoExplorerUI, Key=TodoExplorer_LineNumber}" Binding="{Binding Selection.Selection.StartLine}" />
531+
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.Resources.ToDoExplorer.ToDoExplorerUI, Key=TodoExplorer_Description}" Binding="{Binding Description, Mode=OneTime}" Width="*"/>
532+
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=ProjectName}" Binding="{Binding Selection.QualifiedName.ProjectName, Mode=OneTime}" />
533+
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=ModuleName}" Binding="{Binding Selection.QualifiedName.ComponentName, Mode=OneTime}" />
534+
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.Resources.ToDoExplorer.ToDoExplorerUI, Key=TodoExplorer_LineNumber}" Binding="{Binding Selection.Selection.StartLine, Mode=OneTime}" />
535535
</controls:GroupingGrid.Columns>
536536
</controls:GroupingGrid>
537537

@@ -540,10 +540,10 @@
540540
SelectedItem="{Binding SelectedItem}"
541541
Visibility="{Binding Path=IsChecked, ElementName=GroupByLocation, Converter={StaticResource BoolToVisibility}}">
542542
<controls:GroupingGrid.Columns>
543-
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.Resources.ToDoExplorer.ToDoExplorerUI, Key=TodoExplorer_Description}" Binding="{Binding Description}" Width="*"/>
544-
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=ProjectName}" Binding="{Binding Selection.QualifiedName.ProjectName}" />
545-
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=ModuleName}" Binding="{Binding Selection.QualifiedName.ComponentName}" />
546-
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.Resources.ToDoExplorer.ToDoExplorerUI, Key=TodoExplorer_LineNumber}" Binding="{Binding Selection.Selection.StartLine}" />
543+
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.Resources.ToDoExplorer.ToDoExplorerUI, Key=TodoExplorer_Description}" Binding="{Binding Description, Mode=OneTime}" Width="*"/>
544+
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=ProjectName}" Binding="{Binding Selection.QualifiedName.ProjectName, Mode=OneTime}" />
545+
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.Resources.RubberduckUI, Key=ModuleName}" Binding="{Binding Selection.QualifiedName.ComponentName, Mode=OneTime}" />
546+
<DataGridTextColumn Header="{Resx ResxName=Rubberduck.Resources.ToDoExplorer.ToDoExplorerUI, Key=TodoExplorer_LineNumber}" Binding="{Binding Selection.Selection.StartLine, Mode=OneTime}" />
547547
</controls:GroupingGrid.Columns>
548548
</controls:GroupingGrid>
549549
</Grid>

0 commit comments

Comments
 (0)