2011-01-07 45 views
11

Tôi phát triển với VS2010 trong C# và tôi muốn tạo Cửa sổ WPF có văn bản thanh tác vụ khác với tiêu đề Cửa sổ. Tiêu đề thuộc tính đặt cả tiêu đề cửa sổ và văn bản trên thanh tác vụ. Có cách nào để đặt chúng tách biệt?Đặt văn bản thanh tác vụ khác với tiêu đề Cửa sổ trong wpf

+2

Tất nhiên, nó đặt cả hai.Bạn có thường thấy ứng dụng có thanh tiêu đề và thanh tác vụ của cửa sổ có chú thích khác nhau không? Làm thế nào bạn thậm chí sẽ biết được một cửa sổ thanh tác vụ tương ứng với cửa sổ nào? –

+0

Lý do sẽ là tiêu đề thanh tác vụ bị cắt bớt, vì vậy có thể kết thúc giống nhau đối với một số cửa sổ. Ví dụ: nếu cửa sổ là "Địa chỉ khách hàng - Tổng công ty ABC" và "Địa chỉ khách hàng - ABCDEFG Inc", bạn có thể nhận "Địa chỉ khách hàng - ABC" cho cả hai. Sẽ rất tuyệt khi có thể thay đổi thành "Khách hàng Thêm". vì vậy phần quan trọng cho thấy. –

+0

... tất nhiên khuyến nghị MSDN là phải có bit phân biệt trước: "ABC Corporation - Địa chỉ khách hàng" cắt bớt thành thứ như "ABC Corporation - Customer Ad". Mà làm cho một số ý nghĩa cho cắt ngắn, nhưng trông kỳ lạ theo cách đó tròn trên tiêu đề cửa sổ bình thường. –

Trả lời

7

Đầu tiên, hãy để tôi củng cố những gì mà Cody Gray đã nói trong cả câu trả lời và nhận xét của anh ấy - đây là hành vi không chuẩn, và bạn nên có lý do tốt để làm điều này.

Điều đó đang được nói, tôi sẽ thực hiện một cách tiếp cận gần như ngược lại với điểm Cody # 1. Tôi sẽ tạo cửa sổ WindowStyle được đặt thành None và tạo lại thanh tiêu đề (có thể bao gồm biểu tượng, "tiêu đề giả", tối thiểu, tối đa hóa và đóng các nút và thậm chí cả menu Windows chuẩn. Bạn cũng cần phải xử lý thay đổi kích thước (có thể được thực hiện bằng cách thiết lập ResizeMode để CanResizeWithGrip, nhưng nó thêm một điều khiển Grip để dưới cùng của cửa sổ của bạn, mà làm cho nó trông hơi khác so với một cửa sổ "bình thường"). sau đó sẽ là Tiêu đề bạn muốn hiển thị trong Thanh tác vụ và "tiêu đề giả" trong thanh tiêu đề bạn tạo sẽ chỉ là một Nhãn hoặc TextBlock ràng buộc với bất cứ điều gì bạn muốn cửa sổ của mình hiển thị.

Nó là một ít phức tạp, nhưng thực sự không quá khó để làm Bạn có thể sẽ gặp phải một số trên đường đi (ví dụ, cách cửa sổ trông trên các hệ điều hành khác nhau hoặc với các chủ đề Windows khác nhau được áp dụng). Điều tốt đẹp là nó không đòi hỏi Interop, và phần lớn nó có thể đạt được chỉ bằng cách sử dụng XAML.

Có rất nhiều ví dụ trực tuyến (here is one Tôi đã chọn ngẫu nhiên).

Một lần nữa, bạn sẽ phải quyết định xem có đáng để nỗ lực tạo hành vi không chuẩn. YMMV.

+1

Cảm ơn câu trả lời của bạn, nó hoạt động tốt và dễ thực hiện. Tôi muốn lưu ý rằng Microsoft làm cho WPF Shell Integartion để tùy chỉnh các cửa sổ chrome (http://code.msdn.microsoft.com/WPFShell). Nhưng hầu hết các tính năng được thực hiện chỉ dành cho Windows 7. – Nicolas

+0

Điểm tốt trên WPFShell. –

4

Về cơ bản, bạn có hai lựa chọn:

  1. Draw the taskbar button yourself, thay vì để Windows xử lý nó. Điều này thực sự là hợp lý đơn giản, như xa như chủ sở hữu vẽ những thứ đi.

  2. Quản lý đồng thời hai biểu mẫu/cửa sổ khác nhau. Bạn sẽ cần phải tạo một cửa sổ chính ẩn sẽ xuất hiện trên thanh tác vụ và sở hữu cửa sổ thứ hai của bạn. Cửa sổ thứ hai của bạn sẽ hiển thị, hiển thị chú thích của chính nó trên thanh tiêu đề và chứa giao diện người dùng thực của bạn, nhưng sẽ không hiển thị trên thanh tác vụ (đặt thuộc tính ShowInTaskbar thành "False"). Bạn sẽ phải viết mã để hiển thị cửa sổ thứ hai bất cứ khi nào người đầu tiên được kích hoạt bằng thanh tác vụ.

Tôi khuyên bạn nên trước khi bắt đầu một trong hai đường dẫn này, bạn nên cân nhắc kỹ xem bạn có thực sự cần "chức năng" này hay không. Thật khó để nói những gì đi với những gì nếu bạn có những gì có hiệu quả một cửa sổ với tên gọi khác nhau ở những nơi khác nhau.

+0

Cảm ơn câu trả lời của bạn. Điểm thứ hai có vẻ khá dễ làm (tôi thích ý tưởng) nhưng tôi không muốn có hai cửa sổ. Về điểm thứ hai, bạn có biết làm thế nào để làm điều đó trong wpf C#? Tôi không biết làm thế nào để ghi đè lên phương pháp IsIconic và tôi sợ không có xử lý cửa sổ trong wpf. – Nicolas

+0

@ Nicolas: Tôi không thực sự có đôi cánh của mình như là một lập trình viên WPF, nhưng lớp ['WindowInteropHelper'] (http://msdn.microsoft.com/en-us/library/system.windows.interop.windowinterophelper. aspx) cho phép bạn tương tác với Windows API không được quản lý. Cụ thể, thuộc tính ['Handle'] của nó (http://msdn.microsoft.com/en-us/library/system.windows.interop.windowinterophelper.handle.aspx) sẽ trả về' hWnd' cho một cửa sổ. Nguy cơ với đề xuất đầu tiên là nó có thể không hoạt động đúng trên các phiên bản Windows mới hơn (như 7) đã thay đổi về cơ bản thanh tác vụ. Tôi rõ ràng đã không thử nghiệm nó. –

+2

@Nicolas Tùy chọn 2 rất dễ dàng. @Cody đúng là bạn cần hiển thị và ẩn cửa sổ thứ hai khi hành động bằng thanh tác vụ. Bạn cũng cần xử lý các nút bấm xem trước mà tôi nghi ngờ sẽ là một cây cầu quá xa. Ứng dụng Delphi trước đây đã sử dụng tùy chọn 2 và do đó cho phép tasbar và chú thích biểu mẫu chính khác nhau, nhưng khi Vista xuất hiện, họ đã ngừng thực hiện việc này. Hơn nữa, có lỗi sau khi lỗi liên quan đến cửa sổ chính và cửa sổ giả không đồng bộ đúng cách. Lời khuyên của tôi là để cuộn với nó và giữ các chú thích giống nhau. –

1

cố gắng sử dụng này: http://www.codeguru.com/forum/showthread.php?t=3833 kết hợp với http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/6b97a6de-0480-4339-8ed0-cb7cdb27bd83

Người đầu tiên hoạt động tốt đối với tôi trong hình thức cổ điển NET ứng dụng khi ta đã làm cửa sổ mà không cần thanh tiêu đề và muốn có một số văn bản trong biểu tượng thanh tác vụ . Điều thứ hai bạn cần xử lý các tin nhắn WIN32 mức thấp trong cửa sổ WPF (nhưng điều này chỉ hoạt động đối với một cấp cao nhất).

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