Files
2026-04-30 11:34:41 +08:00

157 lines
4.9 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
namespace SamplePre.UIWpf.BaseWindows
{
public class BaseWindow : Window
{
public BaseWindow()
{
//InitializeStyle();
//this.Loaded += delegate
//{
// InitializeEvent();
//};
InitializeStyle();
// 一定要在 Loaded 里执行,确保模板已加载
Loaded += (s, e) => InitializeEvent();
}
private void InitializeEvent()
{
// ✅ 关键:从可视化树查找模板内的元素
Button btnMin = FindChild<Button>(this, "btnMin");
Button btnMax = FindChild<Button>(this, "btnMax");
Button btnClose = FindChild<Button>(this, "btnClose");
Border borderTitle = FindChild<Border>(this, "borderTitle");
// 最小化
if (btnMin != null)
btnMin.Click += (s, e) => WindowState = WindowState.Minimized;
// 最大化/还原
if (btnMax != null)
btnMax.Click += (s, e) =>
WindowState = WindowState == WindowState.Normal ? WindowState.Maximized : WindowState.Normal;
// 关闭
if (btnClose != null)
btnClose.Click += (s, e) => Close();
// 拖动窗口
if (borderTitle != null)
{
borderTitle.MouseMove += (s, e) =>
{
if (e.LeftButton == MouseButtonState.Pressed)
DragMove();
};
// 双击标题最大化
borderTitle.MouseLeftButtonDown += (s, e) =>
{
if (e.ClickCount >= 2)
WindowState = WindowState == WindowState.Normal ? WindowState.Maximized : WindowState.Normal;
};
}
}
#region
/// <summary>
/// 在可视化树中查找指定名称的子元素
/// </summary>
public static T FindChild<T>(DependencyObject parent, string childName) where T : DependencyObject
{
if (parent == null) return null;
T foundChild = null;
int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < childrenCount; i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
if (child is T tChild && child is FrameworkElement element && element.Name == childName)
{
foundChild = tChild;
break;
}
foundChild = FindChild<T>(child, childName);
if (foundChild != null) break;
}
return foundChild;
}
#endregion
private void InitializeStyle()
{
Style = (Style)Application.Current.Resources["BaseWindowStyle"];
}
////==================================================
//private void InitializeEvent()
//{
// ControlTemplate baseWindowTemplate = (ControlTemplate)App.Current.Resources["BaseWindowControlTemplate"];
// //Button minBtn = (Button)baseWindowTemplate.FindName("btnMin", this);
// //minBtn.Click += delegate
// //{
// // this.WindowState = WindowState.Minimized;
// //};
// //Button maxBtn = (Button)baseWindowTemplate.FindName("btnMax", this);
// //maxBtn.Click += delegate
// //{
// // this.WindowState = (this.WindowState == WindowState.Normal ? WindowState.Maximized : WindowState.Normal);
// //};
// //Button closeBtn = this.FindName("btnClose") as Button;
// Button closeBtn = (Button)baseWindowTemplate.FindName("btnClose", this);
// closeBtn.Click += delegate
// {
// this.Close();
// };
// Border borderTitle = (Border)baseWindowTemplate.FindName("borderTitle", this);
// borderTitle.MouseMove += delegate (object sender, MouseEventArgs e)
// {
// if (e.LeftButton == MouseButtonState.Pressed)
// {
// this.DragMove();
// }
// };
// borderTitle.MouseLeftButtonDown += delegate (object sender, MouseButtonEventArgs e)
// {
// if (e.ClickCount >= 2)
// {
// //maxBtn.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
// }
// };
//}
//private void InitializeStyle()
//{
// this.Style = (Style)App.Current.Resources["BaseWindowStyle"];
//}
}
}