2008-10-06 40 views
24

Tôi có một Cửa sổ WPF có một trong số các điều khiển khác lưu trữ một Khung. Trong khung đó tôi hiển thị các trang khác nhau. Có cách nào để làm cho một phương thức hộp thoại chỉ với một trang không? Khi tôi hiển thị hộp thoại, bạn không thể nhấp vào bất kỳ điều khiển nào trên trang nhưng bạn có thể nhấp vào điều khiển trên cùng một cửa sổ không có trên trang.Làm cách nào để tạo hộp thoại phương thức cho một Trang trong ứng dụng WPF của tôi?

Trả lời

25

Nếu tôi chính xác trong việc diễn giải thông điệp của bạn, bạn muốn một cái gì đó hoạt động tương tự như những gì Billy Hollis demonstrates in his StaffLynx application.

Gần đây tôi đã xây dựng một điều khiển tương tự và nó chỉ ra rằng loại ý tưởng này là tương đối đơn giản để thực hiện trong WPF. Tôi tạo ra một điều khiển tùy chỉnh gọi là DialogPresenter. Trong mẫu điều khiển cho điều khiển tùy chỉnh, tôi đã thêm đánh dấu tương tự như sau:

<ControlTemplate TargetType="{x:Type local=DialogPresenter}"> 
    <Grid> 
    <ContentControl> 
     <ContentPresenter /> 
    </ContentControl> 
    <!-- The Rectangle is what simulates the modality --> 
    <Rectangle x:Name="Overlay" Visibility="Collapsed" Opacity="0.4" Fill="LightGrey" /> 
    <Grid x:Name="Dialog" Visibility="Collapsed"> 
     <!-- The template for the dialog goes here (borders and such...) --> 
     <ContentPresenter x:Name="PART_DialogView" /> 
    </Grid> 
    </Grid> 
    <ControlTemplate.Triggers> 
    <!-- Triggers to change the visibility of the PART_DialogView and Overlay --> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

Tôi cũng đã thêm một phương pháp Show(Control view), mà tìm những 'PART_DialogView', và cho biết thêm các thông qua trong quan điểm cho Content tài sản.

này sau đó cho phép tôi sử dụng DialogPresenter như sau:

<controls:DialogPresenter x:Name="DialogPresenter"> 
    <!-- Normal parent view content here --> 
    <TextBlock>Hello World</TextBlock> 
    <Button>Click Me!</Button> 
</controls:DialogPresenter> 

Để xử lý các nút sự kiện (hoặc lệnh ràng buộc), tôi chỉ đơn giản là gọi phương thức Show() của DialogPresenter.

Bạn cũng có thể dễ dàng thêm đánh dấu ScaleTransform vào mẫu DialogPresenter để có được hiệu ứng mở rộng được hiển thị trong video. Giải pháp này có mã kiểm soát tùy chỉnh gọn gàng và ngăn nắp, và một giao diện rất đơn giản cho nhóm lập trình UI của bạn.

Hy vọng điều này sẽ hữu ích!

+0

Có, tôi đã có ý tưởng từ ứng dụng StaffLynx. Tôi thấy nó rất khó khăn để grok này WPF công cụ nhưng tôi đoán nó sẽ nhận được dễ dàng hơn. Để có được hộp thoại có thể di chuyển được, tôi đoán có một số thứ khác phải được thực hiện. –

+0

Chắc chắn - để thực hiện chế độ xem có thể di chuyển, bạn sẽ thay thế Canvas nơi chúng tôi có Lưới có tên là "Hộp thoại". Bạn cũng sẽ phải làm tất cả các công cụ kéo/thả. Có một tổng quan tốt về khái niệm này tại: http://www.codeproject.com/KB/WPF/DraggingElementsInCanvas.aspx –

+0

Xin chào Brad, câu trả lời tuyệt vời! Bạn có chia sẻ mã nguồn đầy đủ của DialogPresenter không? Tôi rất muốn sử dụng nó trong một trong các dự án của tôi. Cảm ơn, Jens. – FantaMango77

1

Bạn không tìm kiếm hộp thoại phương thức tại đây. Bạn cần một chức năng sẽ tắt điều khiển "trang", hiển thị hộp thoại và bật lại khi hộp thoại đóng.

Tôi không chắc chắn liệu bạn có hiểu hộp thoại phương thức có nghĩa là phải làm gì không?

+0

Tại sao lưu ý lại? Một cửa sổ Modal là một cửa sổ là cửa sổ duy nhất có thể chấp nhận đầu vào tại thời điểm đó cho một ứng dụng. – Mez

4

tôi có một dự án trên github mà là một phong tục FrameworkElement cho phép bạn hiển thị nội dung đa phương thức qua nội dung chính.

Việc kiểm soát có thể được sử dụng như thế này:

<c:ModalContentPresenter IsModal="{Binding DialogIsVisible}"> 
    <TabControl Margin="5"> 
      <Button Margin="55" 
        Padding="10" 
        Command="{Binding ShowModalContentCommand}"> 
       This is the primary Content 
      </Button> 
     </TabItem> 
    </TabControl> 

    <c:ModalContentPresenter.ModalContent> 
     <Button Margin="75" 
       Padding="50" 
       Command="{Binding HideModalContentCommand}"> 
      This is the modal content 
     </Button> 
    </c:ModalContentPresenter.ModalContent> 

</c:ModalContentPresenter> 

Các tính năng:

  • Hiển thị nội dung tùy ý.
  • Không tắt nội dung chính trong khi nội dung phương thức đang được hiển thị.
  • Vô hiệu hóa quyền truy cập chuột và bàn phím vào nội dung chính trong khi nội dung phương thức được hiển thị.
  • Chỉ là phương thức để chứa nội dung, không phải toàn bộ ứng dụng.
  • có thể được sử dụng theo cách thân thiện với MVVM bằng cách liên kết với thuộc tính IsModal.
Các vấn đề liên quan