Skip to content

Commit ef7214b

Browse files
tblongKeboo
andauthored
Fixes DialogHost visibility on VM disconnect (#3069) (#3092)
* Fixes DialogHost visibility on VM disconnect (#3069) * Adding UI test Reverted change to make sure that we remove dead weak references. --------- Co-authored-by: Kevin Bost <[email protected]>
1 parent 557bb1b commit ef7214b

File tree

5 files changed

+104
-8
lines changed

5 files changed

+104
-8
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<UserControl x:Class="MaterialDesignThemes.UITests.Samples.DialogHost.LoadAndUnloadControl"
2+
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
5+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
6+
xmlns:local="clr-namespace:MaterialDesignThemes.UITests.Samples.DialogHost"
7+
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
8+
mc:Ignorable="d"
9+
d:DesignHeight="450" d:DesignWidth="800">
10+
<Grid x:Name="RootGrid">
11+
<Grid.ColumnDefinitions>
12+
<ColumnDefinition Width="200" />
13+
<ColumnDefinition />
14+
</Grid.ColumnDefinitions>
15+
<StackPanel>
16+
<Button x:Name="LoadDialogHost" Click="LoadDialogHost_Click" Content="Load"/>
17+
<Button x:Name="UnloadDialogHost" Click="UnloadDialogHost_Click" Content="Unload" />
18+
<Button x:Name="ToggleIsOpen" Click="ToggleIsOpen_Click" Content="Toggle IsOpen" />
19+
</StackPanel>
20+
21+
<materialDesign:DialogHost Grid.Column="1" x:Name="DialogHost">
22+
<materialDesign:DialogHost.DialogContent>
23+
<Border Padding="100">
24+
<Button x:Name="CloseButton" Content="Close" Command="{x:Static materialDesign:DialogHost.CloseDialogCommand}" />
25+
</Border>
26+
</materialDesign:DialogHost.DialogContent>
27+
</materialDesign:DialogHost>
28+
</Grid>
29+
</UserControl>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
namespace MaterialDesignThemes.UITests.Samples.DialogHost;
2+
3+
/// <summary>
4+
/// Interaction logic for LoadAndUnloadControl.xaml
5+
/// </summary>
6+
public partial class LoadAndUnloadControl
7+
{
8+
public LoadAndUnloadControl()
9+
{
10+
InitializeComponent();
11+
}
12+
13+
private void LoadDialogHost_Click(object sender, RoutedEventArgs e)
14+
{
15+
RootGrid.Children.Add(DialogHost);
16+
}
17+
18+
private void UnloadDialogHost_Click(object sender, RoutedEventArgs e)
19+
{
20+
RootGrid.Children.Remove(DialogHost);
21+
}
22+
23+
private void ToggleIsOpen_Click(object sender, RoutedEventArgs e)
24+
{
25+
DialogHost.IsOpen = !DialogHost.IsOpen;
26+
}
27+
}

MaterialDesignThemes.UITests/TestBase.cs

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
[assembly: GenerateHelpers(typeof(TimePicker))]
77
[assembly: GenerateHelpers(typeof(DrawerHost))]
88
[assembly: GenerateHelpers(typeof(ColorPicker))]
9+
[assembly: GenerateHelpers(typeof(DialogHost))]
910

1011
namespace MaterialDesignThemes.UITests;
1112

MaterialDesignThemes.UITests/WPF/DialogHosts/DialogHostTests.cs

+34-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System.ComponentModel;
1+
using System.ComponentModel;
22
using System.Windows.Media;
33
using MaterialDesignThemes.UITests.Samples.DialogHost;
44

@@ -315,4 +315,37 @@ await Wait.For(async () =>
315315

316316
recorder.Success();
317317
}
318+
319+
[Fact]
320+
[Description("Issue 3069")]
321+
public async Task DialogHost_WithOpenDialog_ShowsPopupWhenLoaded()
322+
{
323+
await using var recorder = new TestRecorder(App);
324+
325+
IVisualElement<Grid> rootGrid = (await LoadUserControl<LoadAndUnloadControl>()).As<Grid>();
326+
327+
IVisualElement<Button> loadButton = await rootGrid.GetElement<Button>("LoadDialogHost");
328+
IVisualElement<Button> unloadButton = await rootGrid.GetElement<Button>("UnloadDialogHost");
329+
IVisualElement<Button> toggleButton = await rootGrid.GetElement<Button>("ToggleIsOpen");
330+
331+
IVisualElement<DialogHost> dialogHost = await rootGrid.GetElement<DialogHost>("DialogHost");
332+
IVisualElement<Button> closeButton = await dialogHost.GetElement<Button>("CloseButton");
333+
334+
await toggleButton.LeftClick();
335+
336+
await Wait.For(async () => Assert.True(await dialogHost.GetIsOpen()));
337+
await Wait.For(async () => Assert.True(await closeButton.GetIsVisible()));
338+
339+
await unloadButton.LeftClick();
340+
341+
await Wait.For(async () => Assert.False(await closeButton.GetIsVisible()));
342+
343+
await loadButton.LeftClick();
344+
345+
await Wait.For(async () => Assert.True(await closeButton.GetIsVisible()));
346+
347+
await closeButton.LeftClick();
348+
349+
await Wait.For(async () => Assert.False(await dialogHost.GetIsOpen()));
350+
}
318351
}

MaterialDesignThemes.Wpf/DialogHost.cs

+13-7
Original file line numberDiff line numberDiff line change
@@ -854,10 +854,10 @@ private void OnUnloaded(object sender, RoutedEventArgs routedEventArgs)
854854
{
855855
foreach (var weakRef in LoadedInstances.ToList())
856856
{
857-
if (!weakRef.TryGetTarget(out DialogHost? dialogHost) ||
858-
Equals(dialogHost, this))
857+
if (!weakRef.TryGetTarget(out DialogHost? dialogHost) || ReferenceEquals(dialogHost, this))
859858
{
860859
LoadedInstances.Remove(weakRef);
860+
break;
861861
}
862862
}
863863
}
@@ -866,16 +866,22 @@ private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
866866
{
867867
foreach (var weakRef in LoadedInstances.ToList())
868868
{
869-
if (!weakRef.TryGetTarget(out DialogHost? dialogHost))
870-
{
871-
LoadedInstances.Remove(weakRef);
872-
}
873-
if (Equals(dialogHost, this))
869+
if (weakRef.TryGetTarget(out DialogHost? dialogHost) && ReferenceEquals(dialogHost, this))
874870
{
875871
return;
876872
}
877873
}
874+
878875
LoadedInstances.Add(new WeakReference<DialogHost>(this));
876+
877+
if (IsOpen && _popup is { } popup)
878+
{
879+
if (!popup.IsOpen)
880+
{
881+
popup.IsOpen = true;
882+
(popup as PopupEx)?.RefreshPosition();
883+
}
884+
}
879885
}
880886
}
881887
}

0 commit comments

Comments
 (0)