打开新窗口并在C#/ WPF中向其传递参数的语法

时间:2014-08-06 15:15:05

标签: c# wpf

在我的C#/ WPF应用程序中,用户可以单击按钮创建一个新窗口以显示一些图形。目前,按钮处理程序中的代码如下所示。 。 。

var window = (Window)System.Windows.Application.LoadComponent(new Uri("ShowGraphics.xaml", UriKind.Relative));
window.Owner = this;  // keeps the Window on top of the parent window
window.Title = "Show Graphics";
window.Left = 700;
window.Top = 500;
window.Show();

现在我想使用构造函数语法将参数传递给我的新窗口的构造函数,类似这样(伪代码...)

  Window myWindow = new Window("ParameterValue");
  myWindow.Show();

...但我不知道正确的语法是什么用于声明窗口及其关联的XAML文件和其他属性,并传递要在新窗口的构造函数中读取的参数。

PS - 当我们谈论这个主题时,如何将值返回到按钮所在的主窗口?

对第一部分的回答 我认为这就是罗曼柯写作时想要得到的东西

"public partial class TestDialog : Window"

但不是从.Net Window类派生它而是我需要做的是从我特定的向导创建的类派生它(在VS2010中添加> New Item ...)。因为Visual Studio当时同时创建.cs文件和.xaml文件,所以窗口通过这种方式与其XAML布局相关联。然后传递参数,只需通过构造函数完成。从而调用它。 。 。

    var window = new TheNameSpace.ShowGraphics("parameter"); 
    window.Owner = this;  // keeps the Window on top of the parent window
    window.Title = "Show Graphics";
    window.Left = 700;
    window.Top = 500;
    window.Show();

...并在构造函数中使用它。 。 。

public ShowGraphics(String sParam)
{
    InitializeComponent();
    // do stuff
}

PS的答案 一种方法是覆盖子窗口的方法,例如 show()

// Override Show()
public void Show (out string sResult)
{
    Show();  // call the base class method
    sResult = "foo";
    return;
}

...然后,在来电者......

string sReturnVal;
window.Show(out sReturnVal); 

3 个答案:

答案 0 :(得分:0)

抱歉,我应该更清楚,你不能通过Application.LoadComponentStartupUri或任何其他基于XAML的实例化方法创建实例,而无需无参数构造函数(它依赖于有一个)。如果您想提供带参数的构造函数,您可以像在第二个代码段中那样创建窗口:

var window = new ShowGraphics("parameter-value");
window.Show( );

答案 1 :(得分:0)

尝试这样的事情(如果你不想遵循MVVM模式):

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

    private void Button_Click(object sender, RoutedEventArgs e) {
        string inputParam = "some value";
        string outputValue;
        TestDialog dlg = new TestDialog(inputParam);
        if (dlg.ShowDialog() == true)
            outputValue = dlg.OutputParam;
    }
}

public partial class TestDialog : Window
{
    public TestDialog() {
        InitializeComponent();
    }

    public TestDialog(string inputParam) {
        InitializeComponent();
        OutputParam = inputParam.ToUpper(); // for example
    }

    public string OutputParam { get; private set; }

    private void btnOK_Click(object sender, RoutedEventArgs e) {
        DialogResult = true;
    }

}

答案 2 :(得分:0)

在99%的情况下,您无需明确告诉WPF您创建的Window控件的XAML在哪里或哪些内容。执行此操作的代码是为您生成的,并由生成的代码中定义的InitializeComponent方法执行

以下是为WPF应用程序中的MainWindow创建的生成代码的剪切和粘贴。

<强> MainWindow.g.i.cs

/// <summary>
/// MainWindow
/// </summary>
public partial class MainWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {

    private bool _contentLoaded;

    /// <summary>
    /// InitializeComponent
    /// </summary>
    [System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
    public void InitializeComponent() {
        if (_contentLoaded) {
            return;
        }
        _contentLoaded = true;
        System.Uri resourceLocater = new System.Uri("/WpfApplication1;component/mainwindow.xaml", System.UriKind.Relative);

        #line 1 "..\..\MainWindow.xaml"
        System.Windows.Application.LoadComponent(this, resourceLocater);

        #line default
        #line hidden
    }

    [System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
    [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
    [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
    [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
    void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
        this._contentLoaded = true;
    }
}

我再说一遍,您不会编写/编辑此代码,它会自动为您生成。您需要做的只是调用自定义Window的构造函数 - {{1 - 并确保您调用的构造函数调用ShowGraphics方法。

如果您想查看自己生成的代码,可以在$(ProjectDirectory)/ obj / $(Configuration)/文件夹中找到它。