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

本文关键字:语法 参数 窗口 WPF 新窗口 | 更新日期: 2023-09-27 18:16:43

在我的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窗口类派生它,我需要做的是派生它从我的特定向导创建的类(添加>新项目…在VS2010)。因为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); 

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

尝试这样做(如果您不想遵循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;
    }
}

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

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

在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 - ShowGraphics的构造函数,并确保您所调用的构造函数调用InitializeComponent方法。

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