I used WPF to write an interface that implements the function of buttons to switch between different pages, and usercontrol for subpages. When calling this wpf-written interface library in MaxScript, the events are written in MaxScript. Events are useful when the widgets on my main page are bound in MaxScript. But the controls I defined in the subpage have no effect. But when I define Form1.MainContent.Content = Form2 – set the subpage as the main content
The subpage’s controls are also reactive when I first start, when I switch pages. Is there a response to the button event of the subpage, what is the reason, and how to solve it
This is the code for the main page
<Window
x:Class="页面切换测试.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:页面切换测试"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="250"
Height="60"
MinHeight="60"
MaxHeight="1500"
ResizeMode="NoResize"
SizeChanged="MainWindow_SizeChanged"
SizeToContent="Height"
mc:Ignorable="d">
<!-- SizeToContent="Height" -->
<Grid>
<!-- 使用 Grid 布局,定义两行:第一行用于按钮,第二行用于内容 -->
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<!-- 第一行高度自动调整 -->
<RowDefinition Height="*" />
<!-- 第二行占据剩余空间 -->
</Grid.RowDefinitions>
<!-- Buttons to switch between UserControls -->
<StackPanel
Margin="10"
HorizontalAlignment="Center"
VerticalAlignment="Top"
Orientation="Horizontal">
<Button
Width="100"
Click="Button_Click"
Content="Page 1" />
<Button
Width="100"
Click="Button_Click"
Content="Page 2" />
<Button
x:Name="btn1"
Width="auto"
x:FieldModifier="public"
Content="测试" />
<!-- Add more buttons for additional pages as needed -->
</StackPanel>
<!-- 内容区域 -->
<ContentControl
x:Name="MainContent"
Grid.Row="1"
MinHeight="{Binding ElementName=MainWindow, Path=MinHeight}"
MaxHeight="{Binding ElementName=MainWindow, Path=MaxHeight}"
Margin="10"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
x:FieldModifier="public" />
</Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace 页面切换测试
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
private UserControl currentPage;
private Dictionary<string, UserControl> pageCache = new Dictionary<string, UserControl>();
public MainWindow()
{
InitializeComponent();
SwitchToPage("Page 1");
}
public void Button_Click(object sender, RoutedEventArgs e)
{
Button btn = (Button)sender;
switch (btn.Content.ToString())
{
case "Page 1":
SwitchToPage("Page 1");
break;
case "Page 2":
SwitchToPage("Page 2");
break;
// Add cases for additional pages as needed
}
}
public void SwitchToPage(string pageName)
{
if (!pageCache.ContainsKey(pageName))
{
switch (pageName)
{
case "Page 1":
pageCache[pageName] = new Page1();
break;
case "Page 2":
pageCache[pageName] = new Page2();
break;
// Add cases for additional pages as needed
}
}
// 强制重新计算布局
// MainContent.InvalidateArrange();
// MainContent.InvalidateMeasure();
// 订阅 SizeChanged 事件,确保在窗口大小变化时调整高度
// this.SizeChanged += MainWindow_SizeChanged;
// 调整窗口高度
AdjustWindowHeight();
currentPage = pageCache[pageName];
MainContent.Content = currentPage;
//AttachEventHandlers(currentPage);
}
//private void AttachEventHandlers(UserControl page)
//{
// // 解除之前的事件绑定
// var oldButton = currentPage?.FindName("siyou") as Button;
// if (oldButton != null)
// {
// oldButton.Click -= HandleButtonClick;
// }
// // 绑定新的事件处理程序
// var newButton = page.FindName("siyou") as Button;
// if (newButton != null)
// {
// newButton.Click += HandleButtonClick;
// }
//}
//private void MainContent_LayoutUpdated(object sender, EventArgs e)
//{
// // 取消订阅 LayoutUpdated 事件,避免多次触发
// MainContent.LayoutUpdated -= MainContent_LayoutUpdated;
// // 调整窗口高度
// AdjustWindowHeight();
//}
private void AdjustWindowHeight()
{
double minHeight = this.MinHeight;
double maxHeight = this.MaxHeight;
// 使用 Dispatcher 延迟调整窗口高度,确保 ActualHeight 已经计算完成
this.Dispatcher.BeginInvoke(new Action(() =>
{
double contentHeight = MainContent.ActualHeight;
// System.Diagnostics.Debug.WriteLine($"ContentHeight: {contentHeight}");
if (contentHeight > 0 && contentHeight < maxHeight)
{
this.Height = Math.Max(contentHeight + 50, minHeight); // 确保高度不低于 MinHeight
}
else if (contentHeight >= maxHeight)
{
// 如果内容高度超过最大高度,保持窗口高度为最大值
this.Height = maxHeight;
}
else
{
// 如果内容高度小于最小高度,保持窗口高度为最小值
this.Height = minHeight;
}
}), System.Windows.Threading.DispatcherPriority.Render);
}
private void MainWindow_SizeChanged(object sender, SizeChangedEventArgs e)
{
// this.SizeToContent = SizeToContent.Manual;
// this.SizeToContent = SizeToContent.Manual;
AdjustWindowHeight();
}
}
}
这是子页面的界面和事件代码
<UserControl
x:Class="页面切换测试.Page1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:页面切换测试"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
d:DesignHeight="250"
d:DesignWidth="250"
mc:Ignorable="d">
<Grid>
<Button
x:Name="siyou"
HorizontalAlignment="Center"
VerticalAlignment="Center"
x:FieldModifier="public"
Content="这是墙体页面"
FontSize="24" />
</Grid>
</UserControl>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
//using ManagedServices;
namespace 页面切换测试
{
/// <summary>
/// Page1.xaml 的交互逻辑
/// </summary>
public partial class Page1 : UserControl
{
public Page1()
{
InitializeComponent();
}
//private void siyou_Click(object sender, RoutedEventArgs e)
//{
// ManagedServices.MaxscriptSDK.ExecuteMaxscriptCommand("print \"Hello from MaxScript!\"")
//}
}
}
这里是maxscript调用wpf程序的代码
fn main =
(
-- 加载程序集
dotnet.loadAssembly (getFilenamePath (getSourceFileName()) + @"页面切换测试.dll")
global Form1 = dotnetObject "页面切换测试.MainWindow"
global Form2 = dotnetObject "页面切换测试.Page1" -- 子页面对象
-- 切换到子页面
-- local mainContent = Form1.FindName "MainContent"
Form1.MainContent.Content = Form2 -- 设置子页面为主内容
dataContext = Form1.DataContext
Form1.Show()
(dotnetobject "System.Windows.Interop.WindowInteropHelper" Form1).Owner = dotnetobject "IntPtr" (windows.GetMAXHWND())
)
fn handleButtonClick sender args =
(
-- 处理子页面按钮点击事件
messageBox "子页面按钮被点击!"
)
fn handleButtonClick1 sender args =
(
-- 处理主页面按钮点击事件
messageBox "主页面按钮被点击!"
)
-- fn startFocus arg =
-- (
-- enableAccelerators = false
-- )
--
-- fn stopFocus arg =
-- (
-- enableAccelerators = true
-- )
fn setupEventHandlers =
(
-- 主页面按钮事件绑定
-- local button1 = Form1.FindName "btn1"
-- if button1 != undefined do
-- (
dotNet.addEventHandler Form1.btn1 "Click" handleButtonClick1
-- )
-- else
-- (
-- print "Main button not found!"
-- )
-- 子页面按钮事件绑定
-- local button = Form2.FindName "siyou"
dotNet.addEventHandler Form2.siyou "Click" handleButtonClick
dotNet.addEventHandler Form1 "GotFocus" startFocus
dotNet.addEventHandler Form1 "LostFocus" stopFocus
-- else
-- (
-- print "Child button not found!"
-- )
-- 设置生命周期控制
-- dotNet.setLifetimeControl button #dotNet
dotNet.setLifetimeControl Form2.siyou #dotNet
dotNet.setLifetimeControl Form1 #dotNet
dotNet.setLifetimeControl Form2 #dotNet
)
main()
setupEventHandlers()