-4

我有一个关于 wpf 和代表的问题。我正在尝试使 wpf 应用程序以与 Windows 窗体应用程序相同的方式工作。但我认为我需要为此使用代表,但我不知道它是如何工作的。

有人可以向我解释如何做到这一点,我不是在问你是否要制作我的代码。我只是想朝着正确的方向前进。

Windows 窗体代码

Mainform.cs

private void CheckDatabase(bool fix)
    {
        String dbFileName = FileTextBox.Text;
        if (!File.Exists(dbFileName))
        {
            MessageBox.Show(this, "File doesn't exist");
            return;
        }
        Text = (fix ? "Fixing database" : "Checking database") + "'" + dbFileName + "'";
        ContentPanel.Visible = false;
        Logger logger = new Logger(Path.ChangeExtension(dbFileName, ".log"), this, LogTextBox);
        var worker = new CheckDatabaseBackgroundWorker(dbFileName, fix, logger);
        worker.RunWorkerCompleted += CheckDatabaseCompleted;
        worker.Start();
    }

记录器.cs

private readonly Form _form;
    private readonly TextBox _textBox;
    private readonly TextWriter _logFile;
    private delegate void _delegate(String value);

    public Logger(String fileName, Form form, TextBox textBox)
    {
        _form = form;
        _textBox = textBox;
        _logFile = new StreamWriter(fileName, true);
        textBox.Clear();
    }


    private void DisplayText(String value)
    {
        _textBox.AppendText(value + Environment.NewLine);
    }

    public void Write(String msg, params Object[] args)
    {

        _form.Invoke(new _delegate(DisplayText), String.Format(msg, args));
        //_textBox.AppendText(String.Format(msg, args) + Environment.NewLine);
        _logFile.WriteLine(msg, args);
    }

    public String Write(Exception exc)
    {
        String msg = "Exception: " + exc;
        _logFile.WriteLine(msg);
        return msg;
    }

    public void Write(Exception exc, String msg, params Object[] args)
    {
        Write(msg, args);
        _logFile.WriteLine("The exception was: " + exc);
    }

    public void Close()
    {
        _logFile.Close();
    }

wpf代码

主窗口.xaml.cs

public partial class MainWindow
{
    private ICheckDatabase _checkDatabase = new Class1();

    public MainWindow()
    {
        InitializeComponent();
    }

    private void OpenFileButtonClick(object sender, RoutedEventArgs e)
    {
        OpenFileDialog databasefiledialog = new OpenFileDialog
                                        {
                                            CheckPathExists = true,
                                            CheckFileExists = true,
                                            Filter = "Database Files(*.db, *.zip)|*.db;*.zip|All files(*.*)|*.*"
                                        };
        bool? result = databasefiledialog.ShowDialog();

        if (result == true)
        {
            string fileName = databasefiledialog.FileName;
            FileNameTextBox.Text = fileName;
        }
    }

    private void CheckDatabaseButtonClick(object sender, RoutedEventArgs e)
    {

    }

    private void FixDatabaseButtonClick(object sender, RoutedEventArgs e)
    {
        _checkDatabase.FixDatabase();
    }

    private void RemoveConfigButtonClick(object sender, RoutedEventArgs e)
    {
        String fileName = FileNameTextBox.Text;
        Logger logger = new Logger(Path.ChangeExtension(FileNameTextBox.Text, ".log"), this, LogTextBox);

        //logger.Write("");
        //logger.Write("********");
        //logger.Write("******** " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " : removing configurations from database '" + fileName + "'");
        //logger.Write("********");
        //_checkDatabase.RemoveConfigurations(fileName, logger);
        //logger.Close();

    }

    private void PackDatabaseButtonClick(object sender, RoutedEventArgs e)
    {
        String dbFileName = FileNameTextBox.Text;
        String zipFileName = Path.ChangeExtension(dbFileName, ".zip");
        if (!File.Exists(dbFileName))
        {
            MessageBox.Show(this, "File '" + dbFileName + "' doesn't exist", "Error");
            return;
        }
    }
}

WPFlogger.cs

public delegate void LoggerDelegate();
public class WpfLogger
{
    private readonly Form _window;
    private readonly TextBox _textBox;
    private readonly TextWriter _logFile;
    private delegate void _delegate(String value);

    public WpfLogger(String fileName, LoggerDelegate loggerDelegate, TextBox textBox)
    {
        _window = window;
        _textBox = textBox;
        _logFile = new StreamWriter(fileName, true);
        textBox.Clear();
    }


    private void DisplayText(String value)
    {
        _textBox.AppendText(value + Environment.NewLine);
    }

    public void Write(String msg, params Object[] args)
    {

        _window.Invoke(new _delegate(DisplayText), String.Format(msg, args));
        //_textBox.AppendText(String.Format(msg, args) + Environment.NewLine);
        _logFile.WriteLine(msg, args);
    }

    public String Write(Exception exc)
    {
        String msg = "Exception: " + exc;
        _logFile.WriteLine(msg);
        return msg;
    }

    public void Write(Exception exc, String msg, params Object[] args)
    {
        Write(msg, args);
        _logFile.WriteLine("The exception was: " + exc);
    }

    public void Close()
    {
        _logFile.Close();
    }
}

提前致谢

4

1 回答 1

3
  1. 摆脱你的记录器。不要重新发明轮子。使用 log4net、NLog 或 EntLib。
  2. 忘记一对一的代码示例。了解模型-视图-视图模型。使用 MVVMLight 或任何其他支持 MVVM 的库。

干杯和好运。

于 2013-10-29T15:16:10.727 回答