1

たとえば、 my 以外のクラスのラベルを設定する正しい方法(最適な方法)を知りたいMainWindowです。

現時点では、私は次のようなことをします:

public partial class MainWindow: Window {
    public MainWindow() {
        InitializeComponent();

        MyClass a=new MyClass(this);
        a.WriteToLabel();
    }
}

class MyClass {
    MainWindow parent;

    public MyClass(MainWindow parent) {
        this.parent=parent;
    }

    public void WriteToLabel() {
        parent.label1.Text="Test";
    }
}

しかし、これは一種の悪い習慣のように感じます。
20 を超えるクラスがあり、すべてのフィールドまたはプロパティがparent.
このような問題をどのように解決しますか?

4

5 に答える 5

3

label1パラメータとして渡さないのはなぜですか?

と:

class MyClass
{
    public void WriteToLabel(Label label)
    {
        label.Content = "Test";
    }
}

以下を使用します。

var a = new MyClass();
a.WriteToLabel(label1);

通常、コード内で結合をできるだけ避ける方がよいでしょう。ウィンドウへの参照は追加しません。できる限りメソッドをパラメータ化したいと思います。

于 2013-01-12T21:52:36.853 に答える
2

あなたの練習は全体的に良いと思います。しかし、リストを通じてインスタンス化した子を「追跡」することもできるので、最終的には、Linq 拡張機能を使用して特定の子を検索することもできます。また、コードのいくつかの小さなエラーを修正しました (MyClass の親メンバーの命名規則と、親コンストラクターの MyClass インスタンスに割り当てられている WriteToLabel() の無効な結果)。

public partial class MainWindow : Window
{
    private List<MyClass> children;

    public MainWindow()
    {
        children = new List<MyClass>();

        InitializeComponent();

        MyClass child = InstantiateChild();
        child.WriteToLabel();
    }

    private MyClass InstantiateChild()
    {
        MyClass child = new MyClass(this);
        children.Add(child);

        return child;
    }
}

public class MyClass
{
    private MainWindow m_Parent;

    public MyClass(MainWindow parent)
    {
        m_Parent = parent;
    }

    public void WriteToLabel()
    {
        m_Parent.label1.Text = "Test";
    } 
}
于 2013-01-12T22:04:40.647 に答える
0

問題は、に属していないクラスからLabel'を設定する必要がある理由です。ラベルのフォームはそのGUIのコントローラーであり、クラスはフォームに表示したいものを提供する必要があります。TextMainWindow

したがって、これはより良い実践です。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        MyClass a = new MyClass();
        string data = a.GetData();
        label1.Text = text;
    }
}

class MyClass
{
    public MyClass()
    {
        this.parent = parent;
    }

    public stringGetData()
    {
        return "Test";
    } 
}
于 2013-01-12T21:54:45.077 に答える
0

クラスはお互いを完全に認識しているので、プロパティアクセサーを提供するのが良い方法です。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        MyClass a = new MyClass(this);
        a.WriteToLabel();
    }


    public string LabelText
    {  
        get { return label1.Text; }
        set {
                if (this.InvokeRequired) 
                {
                   this.BeginInvoke(
                       delegate() => 
                                { 
                                  label1.Text =value;
                                })};
                 }
                 else
                 {
                    label1.Text = value;
                 }
              }

}

class MyClass
{
    MainWindow parent;

    public MyClass(MainWindow parent)
    {
        this.parent = parent;
    }
    public void WriteToLabel()
    {
        parent.LabelText = "Test";
    } 
}
于 2013-01-12T21:58:50.950 に答える
0

Fluent インターフェイスを使用する

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        MyClass a = new MyClass(this).WriteToLabel("Test");
    }
}

class MyClass
{
    MainWindow parent;

    public MyClass(MainWindow parent)
    {
        this.parent = parent;
    }

    public MyClass WriteToLabel(string txt)
    {
        parent.label1.Text = txt;
        return this;
    } 
}
于 2013-01-12T21:54:34.827 に答える