【问题标题】:How to access controls from another user control without data binding?如何在没有数据绑定的情况下从另一个用户控件访问控件?
【发布时间】:2017-06-13 05:24:13
【问题描述】:

我想从另一个用户控件切换矩形的可见性。我相信我当前的代码不起作用,因为我正在创建第一个用户控件的新实例,我应该从旧的控件中引用。不幸的是,我不知道如何引用。

用户控制 1:

public one()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Window window = new Window
        {
            Title = "Second User Control",
            Content = new two(),
            WindowStartupLocation = WindowStartupLocation.CenterScreen,
            ResizeMode = ResizeMode.NoResize
        };
        window.ShowDialog();
    }

用户控制 2:

one oneUC;
public two()
    {
        InitializeComponent();
        oneUC = new one();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        oneUC.rectangleControl.Visibility = Visibility.Hidden;
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        oneUC.rectangleControl.Visibility = Visibility.Visible;
    }

担忧:

  1. 我知道这样做不是一个好习惯,但我只是使用 wpf 创建这个非常简单的个人项目。这个小项目完成后,我也完成了 wpf。
  2. 没有数据绑定

【问题讨论】:

    标签: c# wpf user-controls


    【解决方案1】:

    用户控制 1:

    private void Button_Click(object sender, RoutedEventArgs e)
        {
        two tw = new two();
        tw.oneUC = this;
            Window window = new Window
            {
                Title = "Second User Control",
                Content = tw,
                WindowStartupLocation = WindowStartupLocation.CenterScreen,
                ResizeMode = ResizeMode.NoResize
            };
            window.ShowDialog();
        }
    

    用户控制 2:

    public two()
        {
            InitializeComponent();
        }
    

    在用户控件 1 中,您需要创建用户控件 2 并将用户控件 1 设置为 oneUC 变量。 在 User Control 2 构造函数中,您必须删除 oneUC = new one(); 它会为你工作。

    【讨论】:

      【解决方案2】:

      脏版

      创建一个可以访问所有用户控件的单例类,例如:

      public static class Container 
      {
          public static UserControl1 Control1 {get;set;}
          public static UserControl2 Control2 {get;set;}
      }
      

      在表单构造函数中(在 InitializeComponent() 之后)将控件分配给单例变量,如下所示:

      Container.Control1 = control1;
      Container.Control2 = control2;
      

      然后在 UserControl2 中您可以执行以下操作:

       private void Button_Click(object sender, RoutedEventArgs e)
       {
           Container.Control1.rectangleControl.Visibility = Visibility.Hidden;
       }
      

      【讨论】:

      • 出于好奇,我也尝试了这个并且它有效,但我回到了另一个答案,因为我发现它更干净。只是想让你知道我很欣赏这个答案并投了赞成票(它被记录下来但没有反映,因为他们说我需要大约 15 分)。
      • 当然!容器解决方案的扩展更简单,因为所有引用都在一个地方。我标记为“脏”,因为在较大的项目中,首选方法是使用 EventAggregator 和 MVVM
      猜你喜欢
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多