2011-08-26 49 views
5

Tôi tự hỏi liệu có thể 'tắt' Cửa sổ chính của tôi không tải tự động khi chương trình của tôi bắt đầu bằng đối số dòng lệnh (tức là khi tên tệp được chuyển). Vấn đề tôi có là chương trình của tôi tải khi một tệp được liên kết với nó được bấm, nhưng làm như vậy bằng cách mở một cửa sổ chính khác và sử dụng nó. Vấn đề tôi có là chương trình vẫn khởi chạy MainWindow sau đó, do đó mở hai Windows, một với nội dung tập tin và một trong đó là sản phẩm nào.C# - Chương trình không có cửa sổ

Làm cách nào để ngăn cửa sổ trống? Khi tôi nhìn thấy nó, tôi hoặc là ngăn chặn nó từ việc mở cửa sổ chính, đóng cửa sổ chính hoặc làm cho chương trình chuyển tập tin vào cửa sổ chính. Vấn đề của tôi là tôi không biết cái nào trong số này sẽ là tốt nhất hoặc làm thế nào để làm điều đó.

Đây là mã:

protected override void OnStartup(StartupEventArgs e) 
    { 
     if (e.Args != null && e.Args.Count() > 0) 
     { 
      this.Properties["ArbitraryArgName"] = e.Args[0]; 
     } 
     base.OnStartup(e); 

     if (Application.Current.Properties["ArbitraryArgName"] != null) 
     { 

      string fname = Application.Current.Properties["ArbitraryArgName"].ToString(); 
      MainWindow mw = new MainWindow(); 
      mw.Show(); 
      mw.readVcard(fname); 
      Application.Current.Windows. 
     } 
    } 

EDIT:

Giải pháp của tôi là ở phía dưới.

+0

phần nào của đối số dòng lệnh đọc và nếu đó là một số giá trị, không hiển thị cửa sổ chính không hoạt động? –

Trả lời

5

Tôi giả sử bạn sử dụng WPF? Bạn sẽ muốn thay thế điểm vào (Main) mà WPF cung cấp cho bạn. Sau đó, bạn có thể khởi động WPF hoặc không phụ thuộc vào các đối số dòng lệnh. Xem câu hỏi này cho biết thêm:

Replacing the WPF entry point

6

Tôi tin rằng bạn có thể thêm một lớp riêng biệt với phương thức Main của riêng mình và đặt đó làm điểm nhập của tệp thực thi của bạn. Sau đó, bạn có thể phân tích các đối số phương thức ở đó và hoặc là đưa lên cửa sổ chính hay không.

(Tôi giả định này là một ứng dụng WPF - đó là đơn giản trong một ứng dụng WinForms như bạn có thể sửa đổi bản gốc phương pháp chính trực tiếp.)

+0

Cảm ơn. Vâng, đó là WPF. Tôi nghĩ rằng tôi làm theo, sẽ kiểm tra và trở lại vào buổi sáng. – user646265

+0

Xem câu trả lời của Qwertie về cách thay thế phương thức 'Chính' mà WPF tạo ra. –

+1

@Merlyn: Không phải là câu trả lời được chấp nhận cho câu hỏi được tham chiếu nói rằng trong khi bạn có thể làm điều đó, người trả lời vẫn khuyên bạn nên tạo một lớp riêng biệt thay thế :) –

1

tôi muốn viết lại mã của bạn như sau:

protected override void OnStartup(StartupEventArgs e) 
{ 
    // start application window 
    MainWindow mw = new MainWindow(); 
    mw.Show(); 
    // store argument and read card info 
    if (e.Args != null && e.Args.Count() > 0) 
    { 
     this.Properties["ArbitraryArgName"] = e.Args[0]; 
     string fname = Application.Current.Properties["ArbitraryArgName"].ToString(); 
     mw.readVcard(fname); 
    } 
} 

Điều này giả định rằng phương pháp MainWindow.readVcard(string) chỉ đơn giản là tải dữ liệu vào trường hợp hiện tại.

1

Hi tất cả mọi người và cảm ơn bạn lại cho tôi, xin lỗi tôi đã không trở lại sớm hơn. Một phần của những gì Nate nói là chính xác ở chỗ tôi cần gọi cho Window của tôi trước đó và sau đó, nếu có đối số dòng lệnh, phân tích cú pháp tên tệp. Vấn đề như tôi đã thấy là nó vẫn khởi động một cửa sổ chính sau đó vì nó được đặt làm khởi động của tôi, vì vậy tôi đã sử dụng thông tin do Qwertie đề xuất để thay đổi app.xaml của tôi, điều đó có nghĩa là nó chỉ ra một khởi động khác, có nghĩa là cửa sổ không được mở một cách không cần thiết.

Trong 'App: Ứng dụng' lớp trong App.xaml.cs:

private void OnStartUp(object sender, StartupEventArgs e) 
    { 
     OnStartup(e); 
    } 

    protected override void OnStartup(StartupEventArgs e) 
    { 
     MainWindow mw = new MainWindow(); 

     if (e.Args != null && e.Args.Count() > 0) 
     { 
      this.Properties["ArbitraryArgName"] = e.Args[0]; 
     } 
     //base.OnStartup(e); 

     if (Application.Current.Properties["ArbitraryArgName"] != null) 
     {    
      string fname = Application.Current.Properties["ArbitraryArgName"].ToString(); 

      mw.Show(); 
      mw.readVcard(fname); 
      //Application curApp = Application.Current; 
      //curApp.Shutdown(); 
     } 

     else if (e.Args.Count() == 0) 
     { 
      mw.Show(); 
     } 
    } 

Trong App.xaml:

<Application x:Class="Vcardviewer.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
      Startup="OnStartUp" 
      > 
    <Application.Resources> 

    </Application.Resources> 
</Application> 
<!--StartupUri="MainWindow.xaml"--> 

Cảm ơn một lần nữa để tất cả mọi người cho câu trả lời của họ. Trân trọng với tất cả các bạn.

0

Tôi chỉnh sửa app.xmal để xóa URL bắt đầu. Sau đó tôi chỉnh sửa app.xaml.cs và thêm một hàm tạo cho ứng dụng và thực hiện việc xử lý của tôi ở đó - tôi sử dụng "Shutdown()" để đóng ứng dụng.

Bạn có thể mở các cửa sổ nếu cần. Khi tôi khởi động các cửa sổ khác, tôi sử dụng sự kiện OnStartup để thực hiện ...

Các vấn đề liên quan