2013-01-10 28 views
16

Tôi đang cố gắng làm điều gì đó có vẻ tương đối đơn giản và logic từ cấp độ giao diện người dùng nhưng tôi có một lỗi gây phiền toái. Tôi có một số ToggleButton và tôi đang cố gắng hiển thị Popup khi nút được bật và ẩn Popup khi nút được tắt. Popup cũng ẩn khi người dùng nhấp vào nó.Làm cách nào để liên kết chính xác Popup với ToggleButton?

Mọi thứ đang hoạt động như mong đợi với XAML sau trừ khi tôi nhấp vào nút bật tắt sau khi Popup được hiển thị, số Popup biến mất trong giây lát rồi xuất hiện lại.

Tôi nghi ngờ những gì đang xảy ra ở đây là việc nhấp chuột ra khỏi Popup sẽ khiến nút này tắt ngay sau khi nút được bật trở lại khi chuột nhấp vào. Tôi chỉ không biết làm thế nào để sửa chữa nó.

Mọi trợ giúp đều được đánh giá cao. Cảm ơn.

<ToggleButton x:Name="TogglePopupButton" Content="My Popup Toggle Button" Width="100" /> 

    <Popup StaysOpen="False" IsOpen="{Binding IsChecked, ElementName=TogglePopupButton, Mode=TwoWay}"> 
     <Border Width="100" Height="200" Background="White" BorderThickness="1" BorderBrush="Black"> 
      <TextBlock>This is a test</TextBlock> 
     </Border>     
    </Popup> 
+0

Điều này không nên khó như vậy. –

Trả lời

28

Câu trả lời của stephans có bất lợi, rằng hành vi mong muốn của việc đóng cửa sổ bật lên bất cứ khi nào nó mất tiêu điểm cũng biến mất.

Tôi đã giải quyết nó bằng cách tắt nút bật tắt khi cửa sổ bật lên mở. Một thay thế sẽ được sử dụng IsHitTestVisible tài sản thay vì được kích hoạt:

<ToggleButton x:Name="TogglePopupButton" Content="My Popup Toggle Button" Width="100" IsEnabled="{Binding ElementName=ToggledPopup, Path=IsOpen, Converter={StaticResource BoolToInvertedBoolConverter}}"/> 
    <Popup x:Name="ToggledPopup" StaysOpen="False" IsOpen="{Binding IsChecked, ElementName=TogglePopupButton, Mode=TwoWay}"> 
     <Border Width="100" Height="200" Background="White" BorderThickness="1" BorderBrush="Black"> 
      <TextBlock>This is a test</TextBlock> 
     </Border>     
    </Popup> 

Bộ chuyển đổi trông như thế này:

public class BoolToInvertedBoolConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value is bool) 
     { 
      bool boolValue = (bool)value; 
      return !boolValue; 
     } 
     else 
      return false; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException("ConvertBack() of BoolToInvertedBoolConverter is not implemented"); 
    } 
} 
+3

Rất thông minh. Tôi đã sử dụng phương pháp IsHitTestVisibile vì chúng ta cần IsEnabled vì các lý do khác. – craftworkgames

+3

Điều này giải quyết vấn đề, nhưng giải pháp dường như phụ thuộc vào một số thời gian khó khăn. Khi tôi thay thế bộ chuyển đổi bằng mô hình khung nhìn tương đương, nó không còn hoạt động nữa. Rõ ràng là các tập hợp nút IsOpen = false, bật lại ToggleButton và nút kích hoạt nút ToggleButton. Không có ý tưởng tại sao phiên bản chuyển đổi hoạt động. Tôi e rằng thời gian có thể bị đánh bom sau này khi phiên bản mới của khuôn khổ được phát hành hoặc khi giải pháp này được sử dụng theo những cách không tầm thường. –

+0

@ RobertVažan Tôi đã đưa cửa sổ bật lên vào một điều khiển tùy chỉnh và hiện đang gặp sự cố bạn đã chỉ định. Nó hoạt động nếu popup là một phần của điều khiển bên ngoài như câu trả lời này cho. –

-1

Set StaysOpen="True" cho bạn Popup

Từ MSDN:

Gets hoặc thiết lập một giá trị cho biết bất cứ điều khiển Popup đóng khi sự kiểm soát không còn tập trung.

[...]

true nếu Popup kiểm soát đóng khi IsOpen tài sản được thiết lập để false;

false nếu điều khiển Popup đóng khi sự kiện bàn phím hoặc chuột xuất hiện bên ngoài điều khiển Popup.

+3

Hiệu ứng mong muốn là vẫn đóng cửa sổ bật lên khi tiêu điểm bị mất. Vấn đề là khi bạn sử dụng một 'ToggleButton' để mở' Popup', và bạn cố gắng đóng 'Popup' bằng cách nhấp vào' ToggleButton'. Nó sẽ thực hiện hành động của 'StaysOpen =" False "' và nhấn vào nút 'ToggleButton' để' Popup' đóng lại rồi mở lại. – deloreyk

11

Giải pháp mà không IValueConverter:

<Grid> 
    <ToggleButton x:Name="TogglePopupButton" Content="My Popup Toggle Button" Width="100" > 
     <ToggleButton.Style> 
      <Style TargetType="{x:Type ToggleButton}"> 
       <Setter Property="IsHitTestVisible" Value="True"/> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding ElementName=Popup, Path=IsOpen}" Value="True"> 
         <Setter Property="IsHitTestVisible" Value="False"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ToggleButton.Style> 
    </ToggleButton> 

    <Popup StaysOpen="false" IsOpen="{Binding IsChecked, ElementName=TogglePopupButton, Mode=TwoWay}" 
       PlacementTarget="{Binding ElementName=TogglePopupButton}" PopupAnimation="Slide" 
      x:Name="Popup"> 
     <Border Width="100" Height="200" Background="White" BorderThickness="1" BorderBrush="Black"> 
      <TextBlock>This is a test</TextBlock> 
     </Border> 
    </Popup> 
</Grid> 
+0

Giải pháp này hoạt động hoàn hảo và tiết kiệm cho tôi khi viết một trình chuyển đổi khác . Lam tôt lăm! –

0

Trên ToggleButton thiết lập Thuộc tính ClickMode="Press"apixeltoofar

+0

Điều này dường như làm việc ở cái nhìn đầu tiên, nhưng trong khi nhấp vào ToggleButton không còn mở lại Popup, nhấp vào bất cứ nơi nào khác đột nhiên không đóng Popup như dự định. Tôi không hiểu tại sao chính xác điều đó là hạnh phúc và nếu nó có thể sửa chữa được, nhưng tôi không thể làm cho nó hoạt động được. –