在我的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);
答案 0 :(得分:0)
抱歉,我应该更清楚,你不能通过Application.LoadComponent
,StartupUri
或任何其他基于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)/文件夹中找到它。