Mam taki Popup, który reaguje na ToggleButton - gdy button ma IsChecked równe True to się pojawia, a jak False to znika.
Dodatkowo, gdy kliknie się gdziekolwiek indziej w programie, to chciałabym, żeby ToggleButton ustawiał się na False, i żeby w efekcie Popup zniknął. Kod, który działa prawie zgodnie z założeniami:
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition SourceName="Preview" Property="IsKeyboardFocusWithin" Value="False" />
</MultiTrigger.Conditions>
<Setter TargetName="Preview" Property="IsChecked" Value="False" />
</MultiTrigger>
<ToggleButton x:Name="Preview" Width="20" Height="20"
Cursor="Hand"
Visibility="Collapsed">
<Grid>
<Image Source="{Binding Source={x:Static properties:Resources.PreviewNormal}, Converter={StaticResource BitmapConverter}}"
Width="20" Height="20" HorizontalAlignment="Left" ToolTip="Pokaż podgląd" />
<Popup x:Name="PreviewPopup"
AllowsTransparency="True"
HorizontalAlignment="Right" HorizontalOffset="10" VerticalOffset="0"
PopupAnimation="Fade" Placement="Right"
PlacementTarget="{Binding ElementName=Root}"
DataContext="{Binding Path=PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
<Popup.Style>
<Style TargetType="Popup">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions >
<Condition Binding="{Binding ShowPreviewText}" Value="True"/>
<Condition Binding="{Binding ElementName=Preview, Path=IsChecked}" Value="True"/>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="IsOpen" Value="True"/>
</MultiDataTrigger.Setters>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Popup.Style>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" x:Name="PopupRoot" >
<Border Background="{StaticResource DefaultBackgroundBrush}"
BorderBrush="{StaticResource DefaultBorderBrush}"
BorderThickness="1" Padding="4"
IsHitTestVisible="True"
Focusable="False"
HorizontalAlignment="Stretch">
<ScrollViewer VerticalScrollBarVisibility="Auto"
MaxHeight="200"
MaxWidth="530">
<TextBlock Text="{Binding PreviewText}" />
</ScrollViewer>
</Border>
</StackPanel>
</Popup>
</Grid>
</ToggleButton>
Mam jednak problem z jedną sytuacją - gdy użytkownik kliknie wewnątrz Popup'u, to Popup znika... A tego nie chcę. Nie rozumiem, dlaczego tak się dzieje, skoro wg dokumentacji IsKeyboardFocusWithin:
Gets a value indicating whether keyboard focus is anywhere within the element or its visual tree child elements. This is a dependency property.
Rozumiem, że focus ucieka z ToggleButton, ale przecież wciąż znajduje się w dziecku tego elementu, nieprawdaż?
Próbowałam w Border zmienić parametr Focusable na True, jednak efekt działania jest ten sam.