2009-01-07 76 views
18

Vì vậy, tôi đang xây dựng một ứng dụng mà sẽ có rất nhiều cửa sổ, tất cả với cùng một bố cục cơ bản:Cách tạo Cửa sổ Mẫu trong WPF?

  1. Một cửa sổ chính
  2. Một logo ở góc trên cùng
  3. Một khối tiêu đề
  4. Một trình hiển thị trạng thái ở dưới cùng
  5. Khu vực dành cho điều khiển cửa sổ cụ thể.

Hiện tại tôi phải tạo lại cấu trúc này trong mọi cửa sổ. Lý tưởng nhất là tôi muốn bố trí này được mã hóa ở một nơi duy nhất, có lẽ vào một lớp con Window tùy chỉnh để dễ sử dụng. Có ai có bất kỳ manh mối nào về cách bắt đầu, hoặc kinh nghiệm trước đó với các vấn đề tương tự?

Trả lời

31

Bạn có thể tạo một ControlTemplate mới nhắm mục tiêu một cửa sổ để thực hiện điều này như được hiển thị bên dưới.

<ControlTemplate x:Key="WindowControlTemplate1" TargetType="{x:Type Window}"> 
    <Border 
     Background="{TemplateBinding Background}" 
     BorderBrush="{TemplateBinding BorderBrush}" 
     BorderThickness="{TemplateBinding BorderThickness}" 
     > 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto"/> 
       <RowDefinition Height="0.93*"/> 
       <RowDefinition Height="Auto"/> 
      </Grid.RowDefinitions> 

      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="0.21*"/> 
       <ColumnDefinition Width="0.79*"/> 
      </Grid.ColumnDefinitions> 

      <ContentPresenter 
       Grid.ColumnSpan="2" 
       Grid.Row="1" 
       Content="{TemplateBinding Content}" 
       ContentTemplate="{TemplateBinding ContentTemplate}" 
       /> 
      <ResizeGrip 
       HorizontalAlignment="Right" 
       x:Name="WindowResizeGrip" 
       VerticalAlignment="Bottom" 
       IsTabStop="False" 
       Visibility="Collapsed" 
       Grid.Column="1" 
       Grid.Row="2" 
       /> 
      <TextBlock Text="My Logo" /> 
      <TextBlock Grid.Column="1" Text="My Title"/> 
      <StatusBar Height="20" Grid.ColumnSpan="2" Grid.Row="2"/> 
     </Grid> 
    </Border> 

    <ControlTemplate.Triggers> 
     <MultiTrigger> 
      <MultiTrigger.Conditions> 
       <Condition Property="ResizeMode" Value="CanResizeWithGrip"/> 
       <Condition Property="WindowState" Value="Normal"/> 
      </MultiTrigger.Conditions> 
      <Setter Property="Visibility" TargetName="WindowResizeGrip" Value="Visible"/> 
     </MultiTrigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 
+0

Cảm ơn! đó là chính xác những gì tôi đang sau! Cảm ơn bạn :) – NoizWaves

-3

tại sao chính xác bạn đang sử dụng "nhiều cửa sổ?" Tại sao không chỉ là một cửa sổ duy nhất với một điều khiển tab? Hoặc một cửa sổ đơn với điều khiển người dùng?

Bất kể, để trả lời câu hỏi của bạn, liên kết người dùng là một cách bạn muốn nhận được chức năng mà bạn mô tả như mong muốn.

Tạo một lớp Cửa sổ mới và có thuộc tính "Trẻ em" cho phép đối tượng được nhúng vào bảng điều khiển đế nơi bạn muốn "điều khiển cửa sổ cụ thể" đi.

Khi bạn khởi chạy cửa sổ mới, khởi tạo loại cửa sổ và điều khiển người dùng bằng các điều khiển cụ thể, thêm điều khiển người dùng vào thuộc tính Trẻ em trong cửa sổ của bạn và sau đó hiển thị cửa sổ. Bạn thậm chí có thể kết nối các trình xử lý sự kiện, DataContexts và những gì không phải lúc này.

+1

Tại sao có quá nhiều downvotes? Có vẻ như một câu hỏi hợp lệ đối với tôi, có lẽ không phải là câu trả lời lý tưởng nhưng nó chắc chắn là đáng xem xét cho tình hình đúng. – MikeKulls

+0

Bởi vì trong khi nó trình bày một giải pháp, nó không thực sự trả lời câu hỏi. Ngoài ra, nó là một phương pháp mạnh bạo lực của một giải pháp. Trong tất cả thực tế, tôi mô tả nó như là một phương pháp WINFORMS để giải quyết nó trên một WPF (mà câu trả lời được chọn là). –

+0

Có thể bạn đang tập trung quá nhiều vào "cửa sổ đơn với một điều khiển tab" bit ?? Cửa sổ đơn với các điều khiển người dùng có thể hoán đổi cho nhau là một giải pháp hoàn toàn hợp lệ trong tình huống phù hợp. Đó là giải pháp duy nhất tránh trùng lặp mã, nếu bạn có nhiều hơn 1 cửa sổ thì mã của một số loại, dù nhỏ, cần phải được sao chép trong mỗi cửa sổ đó. Nếu có thay đổi cần thiết thì mã đó cần được thay đổi ở nhiều vị trí. Nó không phải là một breaker thỏa thuận một trong hai cách nhưng nó là một cái gì đó chắc chắn giá trị xem xét. – MikeKulls

6

Nếu bạn đủ dũng cảm để có một sự thay đổi kiến ​​trúc lớn, bạn có thể xem xét CompositeWPF (trước đây được đặt tên là Prism) từ các Mẫu & Thực tiễn của Microsoft.

Quan tâm đến bạn sẽ là khả năng xác định "vùng" trong trình bao (ví dụ: cửa sổ) và sau đó sử dụng chế độ xem để lấp đầy các vùng. Nó sử dụng mô hình Model-View-Presenter để cho phép phát triển độc lập các "khung nhìn" từ mô hình hơn là có thể dễ dàng được di chuyển theo thời gian vì trình bao chỉ xác định các vùng và không được kết hợp trực tiếp với những gì được đặt vào nó. Về cơ bản, điều này giúp tách vỏ khỏi các khung nhìn và các khung nhìn từ nhau và làm cho việc kiểm tra đơn vị trở nên dễ dàng hơn ... blah, blah blah.

Đó là một bước nhảy lớn và điều gì đó sẽ làm chậm bạn xuống để bắt đầu, mặc dù tình huống của bạn là một trong các loại ứng dụng mà CompositeWPF có nghĩa là để giải quyết.

Là một phần của CompositeWPF, bạn sẽ cần phải thực hiện các mẫu khác nhau có thể gây nhầm lẫn cho người mới đến, ví dụ: UnityContainer, đảo ngược kiểm soát, MVP (hoặc Model/view/view-model) và tiêm phụ thuộc.

Tôi có thể nhớ khi lần đầu tiên tôi bắt đầu với các ứng dụng mẫu đang bối rối bởi vì không rõ ràng làm thế nào trên trái đất, một số chế độ xem thậm chí đã được tạo! Container thống nhất sẽ khởi tạo các đối tượng và gọi các hàm tạo tham số được gọi một cách kỳ diệu.

CompositeWPF là giải pháp thanh lịch cho câu hỏi của bạn nhưng không phải là giải pháp đơn giản hoặc dễ hiểu. Đã sử dụng CompositeWPF trong dự án cuối cùng của tôi, tôi dự định sẽ sử dụng lại nó cho ứng dụng thích hợp tiếp theo.

+0

Cảm ơn bạn đã giới thiệu chi tiết về CompositeWPF. Tôi đã tải về Hướng dẫn ứng dụng hỗn hợp cho WPF và trở nên bối rối hơn, tôi đã tự hỏi liệu có bất kỳ ví dụ đơn giản nào cho người mới bắt đầu học không? – Picflight

+0

@Picflight: Đây là liên kết tới bài viết của Brian Noyes trên DevX http://www.devx.com/codemag/Article/40165/1763. Khi nào bạn có thể lấy mã mẫu, hãy sử dụng trình gỡ lỗi để giúp bạn tìm hiểu cách hoạt động của mọi thứ. Đặt các điểm ngắt trên các hàm tạo của các lớp và đi lên ngăn xếp cuộc gọi để xem nó hoạt động như thế nào. – Rhys

2

Cách tiếp cận đơn giản nhất là tạo WPF là "Trang" cho các điều khiển cửa sổ cụ thể và đặt "Khung" trong cửa sổ chính. Bạn thậm chí có thể tạo điều hướng đẹp theo cách này.

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