Làm thế nào tôi có thể tham khảo ứng dụng Window Window của WPF trong C#, sử dụng một cái gì đó giống như thuộc tính ActiveForm trong WinForms?Tham khảo Cửa sổ đang hoạt động trong WPF?
Trả lời
Một cách có thể sẽ được quét danh sách các cửa sổ đang mở trong ứng dụng và kiểm tra mà một trong số họ có IsActive = true
:
Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive);
Không chắc chắn nếu có thể có nhiều hơn một cửa sổ hoạt động nếu, ví dụ , có một hộp thoại hiển thị, trong trường hợp đó, chủ sở hữu của hộp thoại và hộp thoại có thể hoạt động.
Có cách tốt hơn để thực hiện việc này bằng PInvoke. Aviads câu trả lời là không làm việc tất cả các thời gian (có một số trường hợp cạnh với hộp thoại).
IntPtr active = GetActiveWindow();
ActiveWindow = Application.Current.Windows.OfType<Window>()
.SingleOrDefault(window => new WindowInteropHelper(window).Handle == active);
Một phải bao gồm nhập khẩu sau đây đầu tiên:
[DllImport("user32.dll")]
static extern IntPtr GetActiveWindow();
Hehe. Tôi mất vài giờ để tự khám phá điều này.Tôi thực sự đã viết chính xác điều tương tự như bạn và đến đây để chia sẻ nó, nhưng bạn là người đầu tiên, vì vậy đây là phiếu bầu của tôi: P –
bạn có thể vui lòng xây dựng trên những gì các trường hợp cạnh được? – nchaud
@nchaud Tôi đang sử dụng AvalonDock cho phép bạn kéo một vùng làm việc ra khỏi cửa sổ chính và vào một cửa sổ mới. Tuy nhiên, các cửa sổ này cũng được đánh dấu 'IsActive'. Sử dụng giải pháp khác đã ném một ngoại lệ ('SingleOrDefault' ném nếu có nhiều hơn một vị từ phù hợp) hoặc không cho tôi cửa sổ hoạt động thực tế khi sử dụng' FirstOrDefault' – clcto
Tôi có vấn đề Với cách này "Application.Current.Windows.OfType() SingleOrDefault (x => x.IsActive);" đặc biệt bởi vì tôi đã xây dựng một ứng dụng với một cửa sổ chính sau đó tôi đã có vấn đề khi cửa sổ chính được chọn. Tôi giải quyết nó tạo này:
Trong một số lớp cơ sở hoặc App.xaml.cs tạo này:
public static Window ActivatedWindow {get;set;}
Sau đó đưa vào lớp cơ sở phát sinh Window hoặc toàn bộ Kích hoạt sự kiện của Window của bạn của bạn:
Đầu tiên Lựa chọn - cá nhân Window Base class:
public class MetroToolWindowBase
{
public MetroToolWindowBase()
{
Activated += new EventHandler(MakeActive);
}
private void MakeActive(object sender, EventArgs e)
{
App.ActivatedWindow= this;
}
}
Second Option- trong tổ chức sự kiện kích hoạt của Windows:
private void XWindow_Activated(object sender,EventArgs e)
{
App.ActivatedWindow= this;
}
Tôi biết đây là một câu hỏi cũ nhưng tôi nghĩ câu trả lời của tôi có thể giúp ai đó.
Vấn đề của tôi là: Tôi đã có ứng dụng MVVM WPF và tôi cần để có được ví dụ MainWindow
ở chế độ xem thứ hai, tức là mô hình xem thứ hai, để đặt chế độ hiển thị của nút thanh tiêu đề thành visible
.
Đây là giải pháp của tôi:
MainWindow window = (MyApp.MainWindow)App.Current.MainWindow;
window.btnSearch.Visibility = System.Windows.Visibility.Visible;
Hy vọng điều này sẽ giúp một ai đó.
Nhìn lại câu trả lời cũ của tôi, có thể tốt hơn nếu sử dụng toán tử 'OfType()' thay vì 'Cast ()' chỉ trong trường hợp ... –
tuyệt vời! Điều này giúp tôi không phải chuyển tham chiếu đến cửa sổ, điều này giúp cấu trúc dữ liệu của tôi không có tham chiếu giao diện người dùng. cảm ơn! – BrokeMyLegBiking
Để làm cho nó mạnh mẽ hơn, bạn cũng có thể sử dụng 'FirstOrDefault' thay vì' SingleOrDefault' mà ném một ngoại lệ nếu có nhiều mục phù hợp. Thêm vào đó, nó sẽ nhanh hơn một chút vì nó chấp nhận kết quả đầu tiên và không cần phải kiểm tra xem đó có phải là duy nhất hay không. – ygoe