2012-04-24 24 views
8

Tôi có một điều khiển đang sử dụng cửa sổ bật lên có một số điều khiển WPF bên trong nó và StaysOpen = "True". Vấn đề là khi nhấp vào cửa sổ bật lên khi ứng dụng không có tiêu điểm, ứng dụng sẽ không nhận được tiêu điểm. Tôi đã thực hiện một chút nghiên cứu, và có vẻ như điều này có thể là do thực tế là các cửa sổ bật lên có nghĩa là được sử dụng cho các menu, vì vậy chúng không có tất cả các trình xử lý thông điệp cửa sổ thích hợp được nối. Đây là một mẫu laptop khung để demoing vấn đề:WPF Popup không khiến ứng dụng được tập trung khi nhấp vào

<Window x:Class="TestWindowPopupBehavior.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:TestWindowPopupBehavior="clr-namespace:TestWindowPopupBehavior" Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <Popup StaysOpen="True" IsOpen="True" Placement="Center"> 
     <ListBox> 
      <TextBlock>123</TextBlock> 
      <TextBlock>123</TextBlock> 
      <TextBlock>123</TextBlock> 
      <TextBlock>123</TextBlock> 
      <TextBlock>123</TextBlock> 
      <TextBlock>123</TextBlock> 
     </ListBox> 
    </Popup> 

</Grid> 
</Window> 
  1. Chạy ứng dụng.
  2. Tương tác với hộp danh sách, hộp này sẽ hoạt động tốt.
  3. Chuyển sang ứng dụng khác.
  4. Nhấp vào hộp danh sách trong khi ứng dụng không hoạt động. Không có gì xảy ra
  5. Nhấp vào ứng dụng bên ngoài hộp danh sách.
  6. Nhấp vào hộp danh sách. Nó hiện đang hoạt động.

Điều tôi mong đợi xảy ra ở bước 4 sẽ là ứng dụng sẽ nhận tiêu điểm và hộp danh sách sẽ chọn mục mới.

Có cách giải quyết nào cho vấn đề này không, hoặc có điều gì đó hiển nhiên tôi bị thiếu? Tôi đang xem xét việc viết lại toàn bộ mã popup với các cửa sổ chính thức và thực hiện lại hành vi chúng ta có, nhưng điều đó có vẻ thực sự phức tạp chỉ để khắc phục một vấn đề nhỏ như thế này.

Trả lời

4

Nếu bạn xử lý sự kiện MouseLeftButtonDown, bạn có thể gọi phương thức Window.Activate(). nhưng bạn nên viết nó cho mỗi phần tử - Popup và cho tất cả TextBlock s. Vấn đề bạn có thể gặp phải là trên Windows, bạn có thể hoán đổi các nút chuột, nơi trái sang phải và ngược lại (nhưng tôi không biết cách này hoạt động), vì vậy, có thể bạn phải xử lý sự kiện MouseRightButtonDown.

+3

Phải đủ để sử dụng sự kiện chuột ... Xem trước để bẫy sự kiện đó lên cửa sổ bật lên mà không phải thêm nhiều trình xử lý cho nội dung của nó. – Paul

+0

Nó hoạt động bằng cách sử dụng PreviewXXX cho tôi. – FryGuy

+0

Các bạn có thể cụ thể hơn về Xem trước không? Tôi dường như có cùng một vấn đề. –

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