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);
尝试这样做(如果您不想遵循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)/文件夹中找到它。