You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取WinUI中x:Load控件的加载/卸载通知?

WinUI中获取带x:Load的ToggleSwitch加载/卸载通知

问题描述

在WinUI用户控件中使用带x:Load绑定的ToggleSwitch:

<ToggleSwitch
    x:Load={x:Bind ToggleSwitchIsNeeded, Mode=OneWay}
    >
</ToggleSwitch>

其中ToggleSwitchIsNeeded是用户控件的布尔依赖属性。由于带x:Load和x:Name的元素在生成代码中是字段而非依赖属性,无法对字段注册依赖属性通知,也没有对象能提前注册Load事件,显式加载又会和x:Load绑定冲突,需要在后台代码中获取该ToggleSwitch的加载/卸载通知。

解决方案

1. 直接给ToggleSwitch注册Loaded/Unloaded事件

这是最直接的方案——在XAML中为ToggleSwitch添加Loaded和Unloaded事件,当元素被延迟加载或卸载时,会自动触发对应的事件:

<ToggleSwitch
    x:Name="TargetToggleSwitch"
    x:Load={x:Bind ToggleSwitchIsNeeded, Mode=OneWay}
    Loaded="TargetToggleSwitch_Loaded"
    Unloaded="TargetToggleSwitch_Unloaded"
>
</ToggleSwitch>

后台代码实现事件逻辑:

private void TargetToggleSwitch_Loaded(object sender, RoutedEventArgs e)
{
    var toggleSwitch = (ToggleSwitch)sender;
    // 执行元素加载后的逻辑,比如初始化状态、绑定事件等
}

private void TargetToggleSwitch_Unloaded(object sender, RoutedEventArgs e)
{
    var toggleSwitch = (ToggleSwitch)sender;
    // 执行元素卸载前的逻辑,比如清理事件绑定、保存状态等
}

2. 监听ToggleSwitchIsNeeded依赖属性的变更

因为x:Load的状态完全由ToggleSwitchIsNeeded控制,可在该属性的变更回调中结合元素字段的存在性判断加载/卸载状态:
首先给ToggleSwitch加上x:Name="TargetToggleSwitch",然后在依赖属性定义时添加变更回调:

public static readonly DependencyProperty ToggleSwitchIsNeededProperty =
    DependencyProperty.Register(
        nameof(ToggleSwitchIsNeeded),
        typeof(bool),
        typeof(YourUserControl),
        new PropertyMetadata(false, OnToggleSwitchIsNeededChanged)
    );

public bool ToggleSwitchIsNeeded
{
    get => (bool)GetValue(ToggleSwitchIsNeededProperty);
    set => SetValue(ToggleSwitchIsNeededProperty, value);
}

private static void OnToggleSwitchIsNeededChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var control = (YourUserControl)d;
    bool newIsNeeded = (bool)e.NewValue;

    if (newIsNeeded && control.TargetToggleSwitch != null)
    {
        // 元素已完成加载,执行对应逻辑
    }
    else if (!newIsNeeded && control.TargetToggleSwitch != null)
    {
        // 元素即将被卸载,此时仍可访问元素,执行清理逻辑
    }
}

3. 全局监听Loaded/Unloaded事件(备选)

如果不想在XAML中直接绑定事件,可在用户控件初始化时注册全局的Loaded/Unloaded事件监听,通过判断源元素来定位目标ToggleSwitch:

public YourUserControl()
{
    InitializeComponent();
    this.Loaded += (s, e) =>
    {
        // 注册全局事件监听,包含已处理的事件
        this.AddHandler(UIElement.LoadedEvent, new RoutedEventHandler(OnElementLoaded), handledEventsToo: true);
        this.AddHandler(UIElement.UnloadedEvent, new RoutedEventHandler(OnElementUnloaded), handledEventsToo: true);
    };
}

private void OnElementLoaded(object sender, RoutedEventArgs e)
{
    if (e.OriginalSource is ToggleSwitch toggleSwitch && toggleSwitch.Name == "TargetToggleSwitch")
    {
        // 目标ToggleSwitch加载完成,执行逻辑
    }
}

private void OnElementUnloaded(object sender, RoutedEventArgs e)
{
    if (e.OriginalSource is ToggleSwitch toggleSwitch && toggleSwitch.Name == "TargetToggleSwitch")
    {
        // 目标ToggleSwitch被卸载,执行逻辑
    }
}

内容的提问来源于stack exchange,提问作者sjb-sjb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 05:23:12