1

我有一种奇怪的情况......

我在 WPF 中有一个用户控件,而女巫又附加了一些其他用户控件,然后我有一个巨大的 C# 代码文件,其中包含一个需要访问用户控件 UI 元素和方法的大算法,这个漏洞过程与计时器一起使用它将数据从用户控件发送到 C# 代码文件算法,它需要从控件返回和更新 UI 元素,还需要访问它的方法......

现在的问题是我不想把这个庞大的算法放在我的控件的代码隐藏文件中,而是我想访问控件的 UI 元素并从该代码文件中声明方法......

到目前为止,我尝试的是从我使用的用户控件中实际派生代码文件的类,这工作得很好而且很花哨,但是要访问派生类,我需要创建它的一个新对象并且我显示的 UI 没有得到更新,因为它还创建了一个新的基类对象,我相信......

所以我有类似的东西:

public partial class usrctrlSimulator : UserControl
{
    public usrctrlSimulator()
    {
        this.InitializeComponent();          
    }

    public void StartSimulator()
    {
        Algorithm = new csAlgorithm();

        Algorithm.InitializeSimulator();

        timer1.Start();
    }
}

public class csAlgorithm : usrctrlSimulator
{
    public csAlgorithm()
    {
    }

    public void InitializeSimulator()
    {
         txtblkSimulatorStatus.Text = "Started"; // this element would be from the user control
    }
}

所以我的问题是:如何在不实例化它的新对象的情况下调用派生类,因为这将导致创建新的用户控件对象并且显示的 UI 将不会更新......或者如果我不派生算法类,我有什么可能访问用户控件元素和方法?

4

1 回答 1

0

如果您想坚持使用控件的一个实例并且仍然可以访问派生类中的功能,那么您需要使用派生类作为控件。usrctrlSimulator因此,您可以在任何地方使用 csAlgorithm而不是 的实例。

但是,我不确定这种设计是否是您场景中的最佳方法。该算法并不是真正的用户控件,因此可能派生自usrctrlSimulator不是理想的选择。例如:UserControl有一个名为ApplyTemplate(). 这将是什么意思csAlgorithm?您还可以从不同的角度看待它:csAlgorithm在您可以使用的任何地方使用它是否合理UserControl,例如在调用时UserControl.AddLogicalChild(csAlgorithm)

另一种选择是将算法实例化为usrctrlSimulator(复合)中的成员变量。在这种情况下,您仍然可以在内部使用它,usrctrlSimulator但是您可以清楚地分离两个概念:一方面是 UserControl,另一方面是算法的实现。此外,您可以更改其中任何一个,而对另一个的影响有限。

在这种情况下,您的代码将如下所示:

public partial class usrctrlSimulator : UserControl
{
   public usrctrlSimulator()
   {
      this.InitializeComponent();          
   }

   public void StartSimulator()
   {
      _algorithm= new csAlgorithm();
      _algorithm.InitializeSimulator();
      timer1.Start();
   }

   private csAlgorithm _algorithm;
}

public class csAlgorithm // not a UserControl anymore
{
   public csAlgorithm()
      {
      }

   public void InitializeSimulator()
   {
      txtblkSimulatorStatus.Text = "Started"; // this element would be from the user control
   }
}
于 2010-08-03T01:50:04.597 回答