2012-06-13 37 views
6

Tôi có đoạn code sauLấy chiều cao/chiều rộng của cửa sổ WPF

<Window x:Class="Netspot.DigitalSignage.Client.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" WindowStyle="SingleBorderWindow" 
     WindowStartupLocation="CenterScreen" 
     WindowState="Normal" Closing="Window_Closing"> 

Bất kỳ cố gắng để có được chiều cao/chiều rộng trở lại NaN hoặc 0.0

Bất cứ ai có cho tôi biết một cách để nhận được nó?

Những 2 phương pháp này không làm việc

//Method1 
var h = ((System.Windows.Controls.Panel)Application.Current.MainWindow.Content).ActualHeight; 
var w = ((System.Windows.Controls.Panel)Application.Current.MainWindow.Content).ActualWidth; 

//Method2 
double dWidth = -1; 
double dHeight = -1; 
FrameworkElement pnlClient = this.Content as FrameworkElement; 
if (pnlClient != null) 
{ 
    dWidth = pnlClient.ActualWidth; 
    dHeight = pnlClient.ActualWidth; 
} 

Ứng dụng này sẽ không được chạy toàn màn hình.

+3

Bạn đang thử mã này ở đâu? nếu bạn đang cố gắng trong các Constructor cho cửa sổ, nó sẽ không hoạt động nếu không 'this.ActualHeight' sẽ cung cấp cho bạn chiều cao thực tế của cửa sổ – Habib

+0

vì vậy tôi phải làm điều đó sau khi window_loaded? tốt điểm làm thế nào tôi có thể kích thước một cửa sổ mà chưa tồn tại :) –

+0

Chính xác, bạn không thể có được kích thước của cửa sổ nếu nó không được tải – Habib

Trả lời

1

WPF thực hiện việc tạo điều khiển và cửa sổ theo cách trì hoãn. Vì vậy, cho đến khi cửa sổ được hiển thị lần đầu tiên, nó có thể chưa trải qua quá trình bố cục, do đó không có ActualWidth/ActualHeight. Bạn có thể đợi cho đến khi cửa sổ được tải và nhận các thuộc tính sau đó, hoặc tốt hơn ràng buộc các thuộc tính này với một đích mà bạn cần chúng. Bạn cũng có thể buộc bố cục qua UpdateLayout().

Chỉ muốn thêm: cố gắng giảm thiểu số lượng logic phụ thuộc kích thước, hầu như luôn có thể tránh được. Trừ khi bạn đang viết một bảng bố trí của khóa học.

6

Bạn có thể nhận được chiều rộng và chiều cao mà cửa sổ có nghĩa là nằm trong hàm dựng sau khi InitializeComponent đã được chạy, chúng sẽ không trả lại NaN sau đó, chiều cao và chiều rộng thực tế sẽ phải đợi cho đến khi cửa sổ được hiển thị .

Khi WindowState == Normal Bạn có thể thực hiện việc này từ Width/Height sau IntializeComponent().

Khi WindowState == Maximized Bạn có thể nhận độ phân giải màn hình với bộ phim này với

System.Windows.SystemParameters.PrimaryScreenHeight; 
System.Windows.SystemParameters.PrimaryScreenWidth; 
+0

Đây là chiều cao và chiều rộng màn hình của màn hình chính, không nhất thiết là màn hình hiện tại. – user2481095

+0

Câu hỏi không phải là về việc nhận giá trị "màn hình hiện tại", đó là câu hỏi đặt câu hỏi tại sao op lại nhận NaN thay vì giá trị. – Andy

5

Bạn phải cố gắng để có được những ActualWidth/ActualHeight giá trị một khi cửa sổ được Loaded trong UI. Làm việc đó trong Window_Loaded hoạt động tốt.

1

1.) Theo dõi sự kiện kích thước cửa sổ lại trong các mã sau:

this.SizeChanged += OnWindowSizeChanged; 

2.) Sử dụng các đối tượng SizeChangedEventArgs 'e' để có được kích thước bạn cần:

protected void OnWindowSizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    double newWindowHeight = e.NewSize.Height; 
    double newWindowWidth = e.NewSize.Width; 
    double prevWindowHeight = e.PreviousSize.Height; 
    double prevWindowWidth = e.PreviousSize.Width; 
} 

Xin lưu ý đây là trường hợp rất chung chung, bạn CÓ THỂ (bạn có thể không phải) phải kiểm tra để đảm bảo rằng bạn có giá trị kích thước bằng 0.

Tôi đã sử dụng tùy chọn này để tự động thay đổi kích thước hộp danh sách thay đổi cửa sổ. Về cơ bản tất cả những gì tôi muốn là chiều cao của điều khiển này để thay đổi cùng một số lượng chiều cao của cửa sổ thay đổi để 'bảng điều khiển' của bố mẹ trông phù hợp trong mọi thay đổi cửa sổ.

Đây là mã cho điều đó, ví dụ cụ thể hơn:

LƯU Ý Tôi có một số nguyên Ví dụ riêng gọi là 'resizeMode' được đặt thành 0 trong constructor mã Window phía sau.

Đây là xử lý sự kiện OnWindowSizeChanged:

protected void OnWindowSizeChanged (object sender, SizeChangedEventArgs e) 
    { 
     if (e.PreviousSize.Height != 0) 
     { 
      if (e.HeightChanged) 
      { 
       double heightChange = e.NewSize.Height - e.PreviousSize.Height; 
       if (lbxUninspectedPrints.Height + heightChange > 0) 
       { 
        lbxUninspectedPrints.Height = lbxUninspectedPrints.Height + heightChange; 
       } 
      } 
     } 
     prevHeight = e.PreviousSize.Height; 
    } 
+0

Đây phải là câu trả lời –

3

XAML

<Grid x:Name="Grid1"> 
     <Image x:Name="Back_Image" HorizontalAlignment="Left" VerticalAlignment="Top"/> 
</Grid> 

CS MainWindow() sau khi InitializeComponent();

Back_Image.Width = Grid1.Width; 
    Back_Image.Height = Grid1.Height; 
+1

Chào mừng bạn đến với Stack Overflow. Khi đăng câu trả lời, hãy giúp người đăng bài và người tìm kiếm trong tương lai bằng cách giải thích trong câu trả lời của bạn cách câu trả lời của bạn giải quyết câu hỏi của họ. – SnareChops

1

Chú ý rằng khi bạn sử dụng điều khiển 100% với, họ có một kích thước NaN đến khi họ đang được đại diện

Bạn có thể kiểm tra ActualHeigh hoặc ActualWidth chỉ khi sự kiện Loaded là bắn, nhưng không bao giờ cố gắng xác minh nó trước khi các điều khiển cửa sổ được tạo ra. Quên ý tưởng để kiểm soát điều đó trong hàm tạo.

Trong ý kiến ​​của tôi, nơi tốt nhất để kiểm soát loại sự kiện này là Sự kiện SizeChanged

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