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

如何在VB/C#代码中访问MenuFlyout内的TextBox?

如何在代码中访问MenuFlyout内的TextBox控件?

我明白你遇到的问题了——MenuFlyout里的TextBox控件没法直接通过名称访问对吧?这是因为Flyout里的控件不属于页面主可视化树的一部分,所以VB编译器没法直接识别它。下面给你几种可行的解决方法,包含VB.NET和C#的示例:

首先先补全一下你的XAML代码上下文(方便示例演示):

<Button x:Name="btnSettings" FontSize="16" FontFamily="Segoe MDL2 Assets" Content="&#xE115;" 
        Foreground="{StaticResource NuhmeTextColor}" 
        RelativePanel.AlignLeftWithPanel="True" RelativePanel.AlignBottomWithPanel="True" 
        Margin="4,0,0,4">
    <Button.Flyout>
        <MenuFlyout x:Name="settingsFlyout">
            <MenuFlyoutItem>
                <TextBox x:Name="txtSettingsCity" PlaceholderText="输入城市"/>
            </MenuFlyoutItem>
        </MenuFlyout>
    </Button.Flyout>
</Button>

方法一:直接使用FindName查找控件

MenuFlyout的内容是MenuFlyoutItem集合,我们可以先定位到对应的MenuFlyoutItem,再在它的内容树里查找目标TextBox。

VB.NET 示例

' 定位到第一个MenuFlyoutItem(根据你的实际索引调整)
Dim flyoutItem As MenuFlyoutItem = CType(settingsFlyout.Items(0), MenuFlyoutItem)
' 在flyoutItem的内容中查找txtSettingsCity
Dim txtCity As TextBox = CType(flyoutItem.Content.FindName("txtSettingsCity"), TextBox)

' 确认控件存在后操作
If txtCity IsNot Nothing Then
    txtCity.Text = "默认城市"
End If

C# 示例

// 获取目标MenuFlyoutItem
MenuFlyoutItem flyoutItem = settingsFlyout.Items[0] as MenuFlyoutItem;
// 查找TextBox控件
TextBox txtCity = flyoutItem.Content.FindName("txtSettingsCity") as TextBox;

// 操作控件
if (txtCity != null)
{
    txtCity.Text = "Default City";
}

方法二:通过Flyout的Opened事件获取(更可靠)

如果控件加载有延迟,在Flyout打开时获取控件会更稳妥,确保控件已经完全加载到可视化树中。

VB.NET 示例

首先给MenuFlyout添加Opened事件:

<MenuFlyout x:Name="settingsFlyout" Opened="SettingsFlyout_Opened">

然后在后台代码实现事件处理:

Private Sub SettingsFlyout_Opened(sender As Object, e As Object)
    Dim flyout As MenuFlyout = CType(sender, MenuFlyout)
    Dim flyoutItem As MenuFlyoutItem = CType(flyout.Items(0), MenuFlyoutItem)
    Dim txtCity As TextBox = CType(flyoutItem.Content.FindName("txtSettingsCity"), TextBox)
    
    If txtCity IsNot Nothing Then
        ' 这里可以初始化控件值或者绑定数据
        txtCity.Text = "初始化城市"
    End If
End Sub

C# 示例

先添加XAML事件:

<MenuFlyout x:Name="settingsFlyout" Opened="SettingsFlyout_Opened">

后台代码:

private void SettingsFlyout_Opened(object sender, object e)
{
    MenuFlyout flyout = sender as MenuFlyout;
    MenuFlyoutItem flyoutItem = flyout.Items[0] as MenuFlyoutItem;
    TextBox txtCity = flyoutItem.Content.FindName("txtSettingsCity") as TextBox;
    
    if (txtCity != null)
    {
        txtCity.Text = "Initial City";
    }
}

方法三:递归遍历可视化树(适用于复杂模板场景)

如果你的TextBox是放在MenuFlyoutItem的ControlTemplate里面,上面的方法可能失效,这时候可以用递归方法遍历整个可视化树来查找控件:

VB.NET 递归查找方法

Private Function FindChildControl(Of T As Control)(parent As DependencyObject, controlName As String) As T
    If parent Is Nothing Then Return Nothing
    
    ' 遍历所有子元素
    For i As Integer = 0 To VisualTreeHelper.GetChildrenCount(parent) - 1
        Dim child As DependencyObject = VisualTreeHelper.GetChild(parent, i)
        
        ' 检查当前子元素是否是目标控件
        Dim control As T = TryCast(child, T)
        If control IsNot Nothing AndAlso control.Name = controlName Then
            Return control
        Else
            ' 递归查找子元素的子元素
            Dim foundControl As T = FindChildControl(Of T)(child, controlName)
            If foundControl IsNot Nothing Then
                Return foundControl
            End If
        End If
    Next
    
    Return Nothing
End Function

使用方法:

' 从MenuFlyout开始查找txtSettingsCity
Dim txtCity As TextBox = FindChildControl(Of TextBox)(settingsFlyout, "txtSettingsCity")
If txtCity IsNot Nothing Then
    ' 操作控件
End If

C# 递归查找方法

private T FindChildControl<T>(DependencyObject parent, string controlName) where T : Control
{
    if (parent == null) return null;
    
    // 遍历所有子控件
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
    {
        var child = VisualTreeHelper.GetChild(parent, i);
        
        // 判断是否是目标控件
        T control = child as T;
        if (control != null && control.Name == controlName)
        {
            return control;
        }
        else
        {
            // 递归查找
            T foundControl = FindChildControl<T>(child, controlName);
            if (foundControl != null)
            {
                return foundControl;
            }
        }
    }
    
    return null;
}

使用方法:

TextBox txtCity = FindChildControl<TextBox>(settingsFlyout, "txtSettingsCity");
if (txtCity != null)
{
    // 执行操作
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:26:56