mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-06-11 12:14:53 +08:00
[HostsFileEditor]Fix hosts content dialog on top of title bar (#21924)
* [Hosts]Don't overlap title bar with dialogs * Use VisualTreeHelper instead
This commit is contained in:
parent
07dd66ecbc
commit
0a19f0dfc7
67
src/modules/Hosts/Hosts/Helpers/VisualTreeUtils.cs
Normal file
67
src/modules/Hosts/Hosts/Helpers/VisualTreeUtils.cs
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
// Copyright (c) Microsoft Corporation
|
||||||
|
// The Microsoft Corporation licenses this file to you under the MIT license.
|
||||||
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
|
using Microsoft.UI.Xaml;
|
||||||
|
using Microsoft.UI.Xaml.Media;
|
||||||
|
|
||||||
|
namespace Hosts.Helpers
|
||||||
|
{
|
||||||
|
// Taken from https://github.com/microsoft/microsoft-ui-xaml/blob/main/test/MUXControlsTestApp/Utilities/VisualTreeUtils.cs
|
||||||
|
// Original copyright header:
|
||||||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
// Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||||
|
public static class VisualTreeUtils
|
||||||
|
{
|
||||||
|
public static T FindVisualChildByType<T>(this DependencyObject element)
|
||||||
|
where T : DependencyObject
|
||||||
|
{
|
||||||
|
if (element == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (element is T elementAsT)
|
||||||
|
{
|
||||||
|
return elementAsT;
|
||||||
|
}
|
||||||
|
|
||||||
|
int childrenCount = VisualTreeHelper.GetChildrenCount(element);
|
||||||
|
for (int i = 0; i < childrenCount; i++)
|
||||||
|
{
|
||||||
|
var result = VisualTreeHelper.GetChild(element, i).FindVisualChildByType<T>();
|
||||||
|
if (result != null)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static FrameworkElement FindVisualChildByName(this DependencyObject element, string name)
|
||||||
|
{
|
||||||
|
if (element == null || string.IsNullOrWhiteSpace(name))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (element is FrameworkElement elementAsFE && elementAsFE.Name == name)
|
||||||
|
{
|
||||||
|
return elementAsFE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int childrenCount = VisualTreeHelper.GetChildrenCount(element);
|
||||||
|
for (int i = 0; i < childrenCount; i++)
|
||||||
|
{
|
||||||
|
var result = VisualTreeHelper.GetChild(element, i).FindVisualChildByName(name);
|
||||||
|
if (result != null)
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -323,6 +323,7 @@
|
|||||||
<ContentDialog
|
<ContentDialog
|
||||||
x:Name="EntryDialog"
|
x:Name="EntryDialog"
|
||||||
x:Uid="EntryDialog"
|
x:Uid="EntryDialog"
|
||||||
|
Loaded="ContentDialog_Loaded_ApplyMargin"
|
||||||
IsPrimaryButtonEnabled="{Binding Valid, Mode=TwoWay}"
|
IsPrimaryButtonEnabled="{Binding Valid, Mode=TwoWay}"
|
||||||
PrimaryButtonStyle="{StaticResource AccentButtonStyle}">
|
PrimaryButtonStyle="{StaticResource AccentButtonStyle}">
|
||||||
<ContentDialog.DataContext>
|
<ContentDialog.DataContext>
|
||||||
@ -368,6 +369,7 @@
|
|||||||
<ContentDialog
|
<ContentDialog
|
||||||
x:Name="AdditionalLinesDialog"
|
x:Name="AdditionalLinesDialog"
|
||||||
x:Uid="AdditionalLinesDialog"
|
x:Uid="AdditionalLinesDialog"
|
||||||
|
Loaded="ContentDialog_Loaded_ApplyMargin"
|
||||||
PrimaryButtonCommand="{x:Bind UpdateAdditionalLinesCommand}"
|
PrimaryButtonCommand="{x:Bind UpdateAdditionalLinesCommand}"
|
||||||
PrimaryButtonStyle="{StaticResource AccentButtonStyle}">
|
PrimaryButtonStyle="{StaticResource AccentButtonStyle}">
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@ using System;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
using CommunityToolkit.Mvvm.Input;
|
using CommunityToolkit.Mvvm.Input;
|
||||||
|
using Hosts.Helpers;
|
||||||
using Hosts.Models;
|
using Hosts.Models;
|
||||||
using Hosts.Settings;
|
using Hosts.Settings;
|
||||||
using Hosts.ViewModels;
|
using Hosts.ViewModels;
|
||||||
@ -181,5 +182,19 @@ namespace Hosts.Views
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ContentDialog_Loaded_ApplyMargin(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Based on the template from dev/CommonStyles/ContentDialog_themeresources.xaml in https://github.com/microsoft/microsoft-ui-xaml
|
||||||
|
var border = Helpers.VisualTreeUtils.FindVisualChildByName(sender as ContentDialog, "BackgroundElement") as Border;
|
||||||
|
border.Margin = new Thickness(0, 32, 0, 0); // Should be the size reserved for the title bar as in MainWindow.xaml
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logger.LogError("Couldn't set the margin for a content dialog. It will appear on top of the title bar.", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user