1

私のコードはあまり関係ありませんが、背景を説明するために、次のmessageWindowようなウィンドウのインスタンスを開くメソッドがあります。

private void SetMessagePosition(Controls.Button btn, string text)
        {
            messageWindow = new messageWindow(text);
            relativePoint = btn.TransformToAncestor(this).Transform(new Point(0, 0));

            messageWindow.Left = relativePoint.X + this.Left;
            messageWindow.Top = relativePoint.Y + this.Top;
            messageWindow.Show();
        }

しかし、この方法を使用して他のウィンドウも開くことができるかどうかを確認したいと思います。これは明らかに、開きたい新しいウィンドウの名前をパラメーターとして渡すことを意味します。私の質問は、どのようにですか?私はそのようにパラメータを渡そうとしました;

private void SetMessagePosition(Window newWin, Controls.Button btn, string text))
        {
            newWin = new newWin(text);
            ...

Where newWin= 開きたいウィンドウのタイプ。しかし、new newWinVS は と呼ばれるウィンドウを認識していないため、明らかにパーツはエラーをスローしますnewWin

あなたの最初の考えは、このメソッドを呼び出す前にウィンドウをインスタンス化するだけでなく、この行をすべてスキップできるということです。このメソッドは、実際には、開いた時点で親ウィンドウに対する新しいウィンドウの位置を設定します。したがって、今までその位置を設定することはできませんでした。

私が試してみようと思ったもう1つのことは次のとおりです。

List<Window> winList;
List<Type> winListType;

winList.Add(window1);
winList.Add(window2);
winList.Add(window3);

winListType.Add(Window1);
winListType.Add(Window2);
winListType.Add(Window3);

SetMessagePosition(winList[2], winListType[2], btn1, "Yes");

private void SetMessagePosition(Window newWin, Type newWinType, Controls.Button btn, string text))
        {
            newWin = new newWinType(text);
            ...

しかし、 のリストであっても、変数ではなく anewWinTypeが渡されるのは好きではありません。誰かがこれを行う方法/回避策を知っていれば、私は非常に感銘を受けます.TypeType

4

2 に答える 2

2

このようなインターフェースを使用して:

interface IWindow
    {
        int Left
        {
            get;
            set;
        }
        int Right
        {
            get;
            set;
        }
    void ShowWindow();
}

次に、タイプが何であれ、すべてのウィンドウに実装します。

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

        }



        public new int Left
        {
            get
            {
                return Left;
            }
            set
            {
                Left = value;
            }
        }

        public int Right
        {
            get
            {
                return Right;
            }
            set
            {
                Left = value;
            }
        }

        public void ShowWindow()
        {
            Show();
        }
    }

次に、パラメータを次IWindowのように変更します。

private void SetMessagePosition(IWindow window, Controls.Button btn, string text))
        {
于 2012-06-28T13:39:40.037 に答える
2

タイプを渡すことができるように、ジェネリックメソッドにする必要があります。

private void SetMessagePosition<T>(Controls.Button btn, string text) where T : Window, new()
{
    T window = new T();
    relativePoint = btn.TransformToAncestor(this).Transform(new Point(0, 0));
    window.Left = relativePoint.X + this.Left;
    window.Top = relativePoint.Y + this.Top;
    window.Show();
}

次に、次のように呼び出すことができます。

SetMessagePosition<messageWindow>(btn, text);

ただし、そのアプローチの欠点は、ジェネリック型を介してオブジェクトをインスタンス化するときに、コンストラクターに何も渡すことができないことです。そのため、SetText メソッドを持つインターフェイスを作成するなど、別の方法でウィンドウにテキストを設定する必要があり、ジェネリック型の別の制約として追加できます。

メソッド自体でインスタンス化するのではなく、新しいウィンドウが既にインスタンス化されてメソッドに渡されることを期待するだけで、この混乱全体を単純化できます。

private void SetMessagePosition(Window window, Controls.Button btn)
{
    relativePoint = btn.TransformToAncestor(this).Transform(new Point(0, 0));
    window.Left = relativePoint.X + this.Left;
    window.Top = relativePoint.Y + this.Top;
    window.Show();
}

次に、次のように呼び出すことができます。

SetMessagePosition(new newWin(text), btn);
于 2012-06-28T13:39:54.350 に答える