RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 987511
Accepted
Алексей Однорог
Алексей Однорог
Asked:2020-05-30 23:17:17 +0000 UTC2020-05-30 23:17:17 +0000 UTC 2020-05-30 23:17:17 +0000 UTC

如何访问用户控件中的控件

  • 772

我在 UserControl 中放入了 2 个表单,并且有一个 Grid,我将 UserControls 添加为子项,具体取决于 ComboBox 中的选择

我需要从 UserControls 中获取 TextBoxes 的值和名称。代码:MainWindow.XAML

    <Grid>
        <ComboBox HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,10,0,0" Name="FormType" SelectionChanged="FormType_SelectionChanged"></ComboBox>
        <Grid Name="FormContent" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="10,50,0,0" Height="261" Width="770"/>
        <Button Name="StartButton" HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="10,0,0,103" Content="START" Click="StartButton_Click"></Button>
        <Button Name="StopButton" HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="100,0,0,103" Content="STOP" Click="StopButton_Click" IsEnabled="False"></Button>
    </Grid>

主窗口.xaml.cs

public partial class MainWindow : Window
{
    UserControl view_form;
    string form = "yaw emulator";
    string[] device_list = { "yaw emulator", "6dof" };
    public MainWindow()
    {
        InitializeComponent();
        foreach (string item in this.device_list)
        {
            FormType.Items.Add(item);
        }
        FormType.SelectedIndex = 0;
        this.MakeContentForm();
    }

    private void MakeContentForm()
    {
        FormContent.Children.Clear();
        if (this.form == "6dof")
        {
            this.view_form = new device_form_6dof();
        }
        else if (this.form == "yaw emulator")
        {
            this.view_form = new device_form_yaw_emulator();
        }
        else
        {
            this.view_form = new device_form_yaw_emulator();
        }
        this.view_form.Name = "View_Form";

        FormContent.Children.Add(view_form);
    }

    private void FormType_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        string text = (sender as ComboBox).SelectedItem as string;

        this.form = text;
        this.MakeContentForm();
    }
    private void StartButton_Click(object sender, RoutedEventArgs e)
    {
        var list = FormContent.Children[0];
        //this.player = new MovePlayer();
        //this.device.start();

        //this.player.Start(this.device);
        this.StartButton.IsEnabled = false;
        this.StopButton.IsEnabled = true;
    }

用户控件之一(它们仅在字段数上有所不同)

device_form_6dof.xaml

<Grid>
    <Label Content="COM port name" HorizontalAlignment="Left" Height="31" Margin="10,10,0,0" VerticalAlignment="Top" Width="101"/>
    <TextBox TextAlignment="Center" Margin="116,14,0,0" TextWrapping="Wrap" Text="COM1" VerticalAlignment="Top" Width="92" HorizontalAlignment="Left" Height="20" Name="port_name" TextChanged="port_name_TextChanged"/>
    <Label Content="Baudrate" HorizontalAlignment="Left" Height="28" Margin="10,41,0,0" VerticalAlignment="Top" Width="101"/>
    <TextBox TextAlignment="Center" Margin="116,45,0,0" TextWrapping="Wrap" Text="9600" VerticalAlignment="Top" Width="92" HorizontalAlignment="Left" Height="20" MaxLength="6" Name="baudrate_tb" TextChanged="baudrate_tb_TextChanged"/>
</Grid>

到目前为止,在 device_form_6dof.xaml.cs 代码中只有存根 - 那里没有什么可显示的......

当按下 Start 时,我还需要获取现在处于活动状态的 UserControl 字段的数据。

在链接上找到类似的东西,但不太明白。

UPD:理论上,我在 view_form 字段中保存了我在表单上使用的 UserControl,并且可以从 MainWindow 中的任何位置访问它。理论上,这是一个UserControl类型的字段, 这里表示我可以使用Controls属性获取我需要的一切。但由于某种原因,我无法访问它......嗯......到目前为止,我看到的唯一选择是为类似的 UserControls 创建一个父类,并为所有具有值的必要字段实现返回方法......但是我不想重新发明轮子。在我看来,你需要的一切都在某个地方。

UPD2:关于控件 - 不正确。引用的 UserControl 来自 System.Windows.Forms 空间,而我是从 System.Windows.Controls 空间创建的。

解决方案:感谢 Max Zhukov 同志 - 他帮了很多忙。我在链接上找到了答案的来源。对于初学者来说,这是一种简单易懂的方法。拿他怎么办?为此,我保留了一个静态 utils 类。

namespace rServer
{
    static class utils
    {
        public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
        {
            if (depObj != null)
            {
                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
                {
                    DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
                    if (child != null && child is T)
                    {
                        yield return (T)child;
                    }

                    foreach (T childOfChild in FindVisualChildren<T>(child))
                    {
                        yield return childOfChild;
                    }
                }
            }
        }
    }
}

然后,在 MainWindow.xaml.cs 中,如有必要,我进行如下调用

foreach (TextBox tb in utils.FindVisualChildren<TextBox>('Имя_элемента_по_которому_ищем'))
        {
            Console.Write(tb.Name);
            Console.WriteLine(tb.Text);
        }
c#
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Макс Жуков
    2020-05-31T17:53:27Z2020-05-31T17:53:27Z

    要解决您的问题,您需要:

    1. TextBox从您的UserControl. VisualTreeHelper一个简单的扩展方法对此也很有用:

      public static IEnumerable<T> GetControls<T>(this DependencyObject depObj) where T : DependencyObject
      {
          if (depObj == null) 
              return null;
      
          for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
          {
             var child = VisualTreeHelper.GetChild(depObj, i);
             var result = (child as T) ?? GetControls<T>(child);
             if (result != null) 
                 return result;
      
             return null;
         }
      }
      
    2. 之后,您可以从 Grid 中获取一组 TextBox:

      IEnumerable<TextBox> textBoxes = 'имя_вашего грида'.GetControls<TextBox>();
      

    并且,相应地,通过遍历集合,询问您需要的字段:

    foreach(TextBox tb in textBoxes)
    {
       //tb.'имя_свойства'
    }
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5