简体   繁体   中英

C# WPF help in override async void

I'm currently converting someone else's code. It is written in C# Windows FORM. and I want it to be in C# WPF.

this is the original code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Net.Sockets;

namespace FileReceiver
{
public partial class MainForm : Form
{
    const int PORT = 1723;

    public MainForm()
    {
        InitializeComponent();
    }

    private void resetControls()
    {
        progressBar1.Style = ProgressBarStyle.Marquee;
        textBox1.Text = "Waiting for connection...";
    }

    protected override async void OnShown(EventArgs e)
    {
        // Listen
        TcpListener listener = TcpListener.Create(PORT);
        listener.Start();
        textBox1.Text = "Waiting for connection...";
        TcpClient client = await listener.AcceptTcpClientAsync();
        NetworkStream ns = client.GetStream();

        // Get file info
        long fileLength;
        string fileName;
        {
            byte[] fileNameBytes;
            byte[] fileNameLengthBytes = new byte[4]; //int32
            byte[] fileLengthBytes = new byte[8]; //int64

            await ns.ReadAsync(fileLengthBytes, 0, 8); // int64
            await ns.ReadAsync(fileNameLengthBytes, 0, 4); // int32
            fileNameBytes = new byte[BitConverter.ToInt32(fileNameLengthBytes, 0)];
            await ns.ReadAsync(fileNameBytes, 0, fileNameBytes.Length);

            fileLength = BitConverter.ToInt64(fileLengthBytes, 0);
            fileName = ASCIIEncoding.ASCII.GetString(fileNameBytes);
        }

        // Get permission
        if (MessageBox.Show(String.Format("Requesting permission to receive file:\r\n\r\n{0}\r\n{1} bytes long", fileName, fileLength), "", MessageBoxButtons.YesNo) != DialogResult.Yes)
        {
            return;
        }

        // Set save location
        SaveFileDialog sfd = new SaveFileDialog();
        sfd.CreatePrompt = false;
        sfd.OverwritePrompt = true;
        sfd.FileName = fileName;
        if (sfd.ShowDialog() != DialogResult.OK)
        {
            ns.WriteByte(0); // Permission denied
            return;
        }
        ns.WriteByte(1); // Permission grantedd
        FileStream fileStream = File.Open(sfd.FileName, FileMode.Create);

        // Receive
        textBox1.Text = "Receiving...";
        progressBar1.Style = ProgressBarStyle.Continuous;
        progressBar1.Value = 0;
        int read;
        int totalRead = 0;
        byte[] buffer = new byte[32 * 1024]; // 32k chunks
        while ((read = await ns.ReadAsync(buffer, 0, buffer.Length)) > 0)
        {
            await fileStream.WriteAsync(buffer, 0, read);
            totalRead += read;
            progressBar1.Value = (int)((100d * totalRead) / fileLength);
        }

        fileStream.Dispose();
        client.Close();
        MessageBox.Show("File successfully received");
        resetControls();
    }
}
}

I've successfully converted all the things in this code into WPF. and the ONLY problem I am getting in WPF is this:

protected override async void OnShown(EventArgs e)

Error   8   'EmployeeLocatorv2.receiver.OnShown(System.EventArgs)': no suitable method found to override

This means that the class your main form is inheriting (probably Window or UserControl) does not have a virtual method named "OnShown" that you can override.

According to Chango V. , Window.ContentRendered is the event you're looking for.

You can use the Window.ContentRendered event to know when the WPF form is rendered.

You can declare the event in your XAML:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" ContentRendered="Window_ContentRendered_1">

And the corresponding code:

private void Window_ContentRendered_1(object sender, EventArgs e)
{
    // Place your code here.
}

In WPF, ContentRendered has a similar behavior.

    bool _hasShown;

    protected override void OnContentRendered(EventArgs e)
    {
        base.OnContentRendered(e);

        if (!_hasShown)
        {
             _hasShown = true;
             // void OnShown() code here!
        }
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM