2010-08-31 47 views
7

Tôi có cửa sổ WPF có bảng mở rộng (qua Expander). Bảng điều khiển nằm ở bên trái của cửa sổ và khi mở rộng cửa sổ sẽ tăng lên để vừa với nội dung.WPF - Mở rộng cửa sổ sang bên trái

Theo mặc định, cửa sổ được neo ở trên cùng bên trái, vì vậy cửa sổ của tôi sẽ phát triển sang phải. Tôi muốn cửa sổ phát triển sang bên trái.

Tôi cố gắng để làm như sau trong trường hợp Window.SizeChanged:

private void onWindowSizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    Left -= (e.NewSize.Width - e.PreviousSize.Width) 
} 

và nó hoạt động, nhưng tốc độ tăng trưởng là giật, và tôi muốn tìm một giải pháp mượt mà hơn.

+0

Tôi đang chơi với giải pháp hiện tại của bạn và dường như có vấn đề. Nếu bạn thay đổi kích thước với độ bám của cửa sổ (tức là không sử dụng Expander), thì việc thay đổi kích thước thực sự là không ổn định. Kết thúc của tôi, hành động thay đổi kích thước cửa sổ cũng phá vỡ mã thay đổi kích thước cửa sổ của bạn và nó sẽ không còn mở rộng sang bên trái. – Dave

Trả lời

4

tôi quản lý để khắc phục điều này bằng cách sử dụng giải pháp đơn giản: Ẩn & Show.

Dưới đây là các mã:

protected override void OnRenderSizeChanged(SizeChangeInfo sizeInfo) 
{ 
    if (!sizeInfo.WidthChanged) 
    { 
     base.OnRenderSizeChanged(sizeInfo); 
     return; 
    } 
    Hide(); 
    base.OnRenderSizeChanged(sizeInfo); 
    Left -= (sizeInfo.NewSize.Width - sizeInfo.PreviousSize.Width); 
    Show(); 
} 

Tôi thay thế các xử lý sự kiện cho Window.SizeChanged với ghi đè này của FrameworkElement.OnRenderSizeChanged.

0

Bạn có thể đặt thiết bị mở rộng của mình vào lưới (nơi kích thước cột có thể thay đổi) và sau đó đặt thuộc tính ExpandDirection của trình mở rộng sang trái?

+0

Tôi muốn cửa sổ * phát triển ở bên trái. Các expander đang phát triển bên trái tốt, nhưng các cửa sổ được thay đổi kích cỡ để phù hợp với nội dung bên phải (vì vậy tất cả mọi thứ di chuyển). –

1

Giải pháp 1

Cố gắng sử dụng tài sản Window: SizeToContent = "width" này sẽ mở rộng cửa sổ của bạn với kích thước của nội dung của bạn và bạn có thể mở rộng nội dung của bạn sử dụng hình ảnh động và giảm bớt, điều này sẽ làm cho tỉ lệ của cửa sổ đẹp và mượt mà.

Giải pháp 2

Bạn có thể tạo một cửa sổ mà lớn hơn đó là nội dung và làm cho nền của bạn trong suốt. Bạn vẫn phải thêm nền cho một số phần tử.

Dưới đây là một ví dụ về cách nó có thể trông giống như: example image

+0

Giải pháp 1 sẽ vẫn khiến cửa sổ đổi kích thước sang trái, phải không? Và giải pháp 2 là tốt đẹp nhưng tôi sẽ không thể sử dụng một cửa sổ thông thường với thanh tiêu đề. Tôi sẽ phải bắt chước bản thân mình. –

2

tôi đã không cố gắng để làm cho một cửa sổ phát triển sang trái như những gì bạn đang yêu cầu, nhưng nếu vẫn thất bại, tôi sẽ xem xét templating một nút để trông giống như nút expander. Sau đó, thay vì cố gắng làm cho Cửa sổ của bạn phát triển sang bên trái, hãy tạo một Cửa sổ mới ở bên trái của Cửa sổ chính của bạn bằng cách sử dụng Biến đổi.

CẬP NHẬT

Vâng, việc thực hiện render kém có thể là thẻ video liên quan, bố trí (quá phức tạp) liên quan, hoặc cả hai. Tôi có một ý tưởng có thể làm được điều đó cho bạn. Jeff Prosise viết blog về một kính lúp trong Silverlight sử dụng WriteableBitmap để đạt được hiệu quả mong muốn. Tôi nghĩ, "tại sao không sử dụng một WriteableBitmap để tạo ra một ảnh chụp màn hình của bố trí của bạn ở bên phải của Expander, và bao gồm các yếu tố khác với nó?". Tôi nghĩ rằng nếu bạn làm điều này và ẩn các phần tử cơ bản (để chúng không được điều chỉnh), hiệu năng dựng hình sẽ được cải thiện nhiều.

Tôi nhận được mã của Jeff để làm việc trong WPF với ít sửa đổi.

http://www.wintellect.com/CS/blogs/jprosise/archive/2009/10/29/more-fun-with-silverlight-3-s-writeablebitmap.aspx

+0

Tôi không hiểu ý kiến ​​của bạn. Bạn có thể vui lòng xây dựng? –

+0

@Omer well, * if * Tôi hiểu chính xác tình huống của bạn, bạn có một người mở rộng mở ra bên trái. Nhưng khi bạn làm điều này, cửa sổ thay đổi kích thước bên phải và toàn bộ nội dung thay đổi xung quanh, mà tôi giả định là tìm kiếm một chút choppy cho bạn. Nếu bạn giữ nguyên toàn bộ cửa sổ * nguyên vẹn *, nó không bao giờ cần phải thay đổi kích thước các con của nó. Bạn có thể giả mạo hiệu ứng này bằng cách sử dụng một nút trông giống như một bộ giãn nở, nhưng khi bạn nhấp vào nó, trình xử lý có thể tạo một cửa sổ hoàn toàn riêng biệt ở bên trái của cửa sổ chính, điều này sẽ tránh được toàn bộ vấn đề thay đổi kích thước. Và bạn có thể làm cho nó hoạt hình. – Dave

+0

Ok, tôi hiểu - nhưng đây là một hack với một tác dụng phụ: kết quả cuối cùng sẽ không giống như một cửa sổ duy nhất (với một thanh tiêu đề duy nhất). Tôi đang tìm một giải pháp mà sẽ cho tôi một cửa sổ duy nhất. –

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