下面的代码演示了一个问题,我关闭子窗口最小化父窗口,我不想发生.
class SomeDialog : Window
{
protected override void OnMouseDoubleClick(MouseButtonEventArgs e)
{
base.OnMouseDoubleClick(e);
new CustomMessageBox().ShowDialog();
}
}
class CustomMessageBox : Window
{
public CustomMessageBox()
{
Owner = Application.Current.MainWindow;
}
}
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
protected override void OnMouseDoubleClick(MouseButtonEventArgs e)
{
base.OnMouseDoubleClick(e);
new SomeDialog() { Owner = this }.Show();
}
}
Run Code Online (Sandbox Code Playgroud)
Window1是主应用程序窗口.
SomeDialog是一个窗口,它弹出Window1中的某个事件(在示例中双击window1),需要是无模式的.
CustomMessageBox是一个窗口,弹出一些需要模态的 "SomeDialog"(在示例中双击SomeDialog)中的某个事件.
如果您运行该应用程序,然后双击Window1的内容以显示SomeDialog,然后双击SomeDialog的内容以显示CustomMessagebox.
现在关闭CustomMessagebox.精细.
现在,如果你关闭SomeDialog,Window1最小化?为什么它最小化,我怎么能阻止它?
编辑:使用Viv提出的技术,似乎解决方法相当简单.
class SomeDialog : Window
{
protected override void OnMouseDoubleClick(MouseButtonEventArgs e) …
Run Code Online (Sandbox Code Playgroud) 我注意到当 MessageBox 处于模式状态时,行为似乎不一致。
首先,从 UI 线程启动 MessageBox。这会产生一个模态 MessageBox,正如预期的那样:
void MainThreadClick(object sender, RoutedEventArgs e)
{
MessageBox.Show("Hello!");
}
Run Code Online (Sandbox Code Playgroud)
接下来,从后台线程启动。这会导致无模式 MessageBox,我猜是因为它不在 UI 线程上?
void WorkerThreadClick(object sender, RoutedEventArgs e)
{
ThreadPool.QueueUserWorkItem((x) =>
{
MessageBox.Show("Hello!");
});
}
Run Code Online (Sandbox Code Playgroud)
接下来,从后台线程启动,但分派到 UI 线程,导致它再次成为模态:
void WorkerThreadClick(object sender, RoutedEventArgs e)
{
ThreadPool.QueueUserWorkItem((x) =>
{
Application.Current.Dispatcher.Invoke(() =>
{
MessageBox.Show("Hello!");
});
});
}
Run Code Online (Sandbox Code Playgroud)
最后,这是一个奇怪的问题,与上面类似,但使用 FileSystemWatcher 线程会导致无模式对话框。为什么是这样?...它是在 UI 线程上调用的,那么为什么它不像前面的示例那样是模态的呢?
public MainWindow()
{
InitializeComponent();
m_watcher = new FileSystemWatcher()
{
Path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
NotifyFilter = NotifyFilters.LastWrite,
IncludeSubdirectories = true,
Filter = "*.*"
};
m_watcher.Changed += …
Run Code Online (Sandbox Code Playgroud) 我正在使用一些现有的代码,定义如下.
class Example
{
public float x_field;
public float x_property
{
get { return x_field; }
set { x_field = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
为什么它这样定义我不知道,但我无法改变它的实现.问题是,当我序列化它时,我显然在xml输出中得到了两个值.如果我无法修改'Example'类,怎么能阻止这种情况发生?
我希望Serializer只输出公共属性而不是公共字段.
我有一个使用 TypeBuilder 来构造动态类型的辅助类。它的用法如下:
var tbh = new TypeBuilderHelper("MyType");
tbh.AddProperty<float>("Number", 0.0f);
tbh.AddProperty<string>("String", "defaultStringValue");
tbh.Close();
var i1 = tbh.CreateInstance();
var i2 = tbh.CreateInstance();
Run Code Online (Sandbox Code Playgroud)
我现在想添加对属性属性(现有属性类型,而不是动态生成的类型)的支持,如下所示:
public class TypeBuilderHelper
{
public void AddProperty<T>(string name, T defaultValue, params Attribute[] attributes)
{
// ...
}
}
public class SomeAttribute : Attribute
{
public SomeAttribute(float a) { }
public SomeAttribute(float a, int b) { }
public SomeAttribute(float a, double b, string c) { }
}
var tbh2 = new TypeBuilderHelper("MyType2");
tbh2.AddProperty<float>("Number", 0.0f, new SomeAttribute(0.0f, 1));
tbh2.AddProperty<string>("String", "defaultStringValue"); …
Run Code Online (Sandbox Code Playgroud) c# ×2
wpf ×2
dialog ×1
dynamic ×1
ignore ×1
messagebox ×1
minimize ×1
modal-dialog ×1
properties ×1
typebuilder ×1
window ×1