小编wfo*_*orl的帖子

关闭子窗口可最大限度地减少父级

下面的代码演示了一个问题,我关闭子窗口最小化父窗口,我不想发生.

    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)

wpf dialog window minimize

10
推荐指数
3
解决办法
3192
查看次数

来自后台线程的模态消息框

我注意到当 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)

wpf modal-dialog messagebox background-thread

5
推荐指数
1
解决办法
1379
查看次数

XmlSerializer忽略公共字段?

我正在使用一些现有的代码,定义如下.

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只输出公共属性而不是公共字段.

c# ignore xmlserializer

4
推荐指数
1
解决办法
1111
查看次数

TypeBuilder - 添加属性

我有一个使用 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# properties dynamic custom-attributes typebuilder

2
推荐指数
1
解决办法
2172
查看次数