2009-03-06 20 views
20

Tôi có một điều khiển WPF Popup có chứa một số điều khiển chỉnh sửa (hộp danh sách, hộp văn bản, hộp kiểm) được đặt ra với khá nhiều khoảng trắng.Tại sao một PopF WPF đóng khi vùng nền của nó được nhấp?

Popup.StaysOpen được đặt thành False, bắt buộc. Nếu người dùng nhấp vào nơi khác trong ứng dụng, thao tác chỉnh sửa sẽ được xem là bị hủy và cửa sổ bật lên sẽ đóng lại.

Thật không may, cửa sổ bật lên cũng đóng bất cứ khi nào người dùng nhấp vào trong vùng nền của cửa sổ bật lên (khoảng cách giữa các điều khiển chỉnh sửa).

Tôi đã thử đặt cửa sổ bật lên thành Focusable. Tôi cũng đã cố gắng thiết lập con của popup (một Border) để được tập trung. Không may mắn ở cả hai mặt trận.

Hơn nữa, sự kiện chuột dường như đường hầm qua cửa sổ bật lên. Bất kỳ phần tử nào bên dưới cửa sổ bật lên khi tôi nhấp vào nó sẽ trở nên tập trung. Điều này mặc dù cả hai số PopupBorder (mà tôi đang nhấp) có cả hai số IsHitTestVisibleFocusable được đặt thành true.

Trả lời

28

Cuối cùng, tôi thấy rằng những điều sau đây đã hiệu quả. Với ...

<Popup x:Name="_popup" 
     StaysOpen="False" 
     PopupAnimation="Slide" 
     AllowsTransparency="True"> 

... Tôi sử dụng mã này trong các nhà xây dựng sau khi gọi InitializeComponent ...

// Ensure that any mouse event that gets through to the 
// popup is considered handled, otherwise the popup would close 
_popup.MouseDown += (s, e) => e.Handled = true; 
+0

+1 rất đẹp và thanh lịch! –

+1

Giải pháp tuyệt vời! Tôi thậm chí có thể làm điều đó với một điều khiển được xác định trên Generic.xaml, bằng cách sử dụng EventToCommand, đi qua EventArgs để lệnh, và sau đó thiết lập Handled = True. Cảm ơn! – Dror

+1

Một cách khác để lén xử lý ngay cả vào một chỗ khó khăn là lấy được một lớp 'ArmouredPopup' có nguồn gốc từ 'Popup'. Nó có thể ghi đè lên 'OnMouseDown'. Tôi coi đây là lỗi trong lớp bật lên mặc định. –

0

Dự đoán tốt nhất của tôi là bạn có một số vấn đề về tính minh bạch đang diễn ra. Hãy thử thiết lập một nền tảng bàn chải trên popup.

+0

Cảm ơn câu trả lời của bạn. Việc kiểm soát biên giới lấp đầy toàn bộ khu vực của cửa sổ bật lên và có một bộ bàn chải rắn –

6

Nó có vẻ kỳ quặc rằng nó sẽ bỏ qua thể đặt tiêu điểm trên Popup và Border. Tôi đã có thể khắc phục vấn đề của bạn bằng cách thay đổi StaysOpen trong một kích hoạt khi chuột là qua biên giới:

<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <ToggleButton x:Name="btnPop" Content="Pop!" Width="100" Height="50"/> 
    <Popup Placement="Bottom" PlacementTarget="{Binding ElementName=btnPop}" IsOpen="{Binding IsChecked, ElementName=btnPop}"> 
     <Popup.Style> 
      <Style TargetType="{x:Type Popup}"> 
       <Setter Property="StaysOpen" Value="False"/> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding IsMouseOver, ElementName=brd}" Value="True"> 
         <Setter Property="StaysOpen" Value="True"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Popup.Style> 
     <Border x:Name="brd" Background="White" BorderThickness="1" BorderBrush="Black"> 
      <StackPanel> 
       <TextBox Margin="10"/> 
       <TextBlock Text="Some text is here." Margin="10"/> 
       <TextBox Margin="10"/> 
      </StackPanel>    
     </Border> 
    </Popup> 
</Grid> 
+0

Thực ra, điều này phù hợp với tôi.Chỉ cần một điều đó là quan trọng cần lưu ý, @RobertMacnee, là bạn nên chắc chắn rằng bạn không đặt những 'tài sản trên các yếu tố Popup tự StaysOpen', nó phải được để lại cho setter phong cách và kích hoạt hoàn toàn nếu không nó sẽ không hoạt động . – Kezzer

1

Đừng bạn đã Popup bạn lồng trong một ToggleButton hoặc loại khác của Button? Sau đó, dừng sự kiện định tuyến ở mức Popup sẽ là hợp lý để làm việc.

0

bạn có thể đặt StayOpen = true, và thiết lập một bộ đếm thời gian, trong MouseLeave sự kiện của Popup timer.Start(), như sau 3 giây, đóng popup này, trong trường hợp MouseEnter, timer.Stop(). Nó sẽ hoạt động.

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