ToggleButton to control Popup
When you must control a Popup with ToggleButton you can bind IsOpen of Popup to IsChecked of ToggleButton and set StaysOpen of Popup to false
but in this cas when the Popup is open and you click another time on ToggleButton, the Popup close and reopen immediatly
for having a better result on click on ToggleButton when Popup is open you can use this Helper
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public class ToggleButtonHelper { #region BindingPopup public static Popup GetBindingPopup(DependencyObject obj) => (Popup)obj.GetValue(BindingPopupProperty); public static void SetBindingPopup(DependencyObject obj, Popup value) => obj.SetValue(BindingPopupProperty, value); public static readonly DependencyProperty BindingPopupProperty = DependencyProperty.RegisterAttached("BindingPopup", typeof(Popup), typeof(ToggleButtonHelper), new PropertyMetadata(null , (ss, ee) => { if (ss is ToggleButton toggle && ee.NewValue is Popup popup) { popup.Closed += delegate { if (!new Rect(0, 0, toggle.ActualWidth, toggle.ActualHeight).Contains(Mouse.GetPosition(toggle))) { toggle.IsChecked = false; } }; toggle.Checked += delegate { popup.IsOpen = true; }; toggle.Unchecked += delegate { popup.IsOpen = false; }; } })); #endregion } |
and use like this
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<ToggleButton x:Name="tb" local:ToggleButtonHelper.BindingPopup="{Binding ElementName=popup}" Content="alpha" Height="32" Width="150" Margin="10,10,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" /> <Popup x:Name="popup" StaysOpen="false" PlacementTarget="{Binding ElementName=tb}" Width="{Binding ActualWidth, ElementName=tb}"> <Border Background="White" BorderBrush="Black" BorderThickness="1" Padding="5"> <StackPanel> <TextBlock Text="alpha" /> <TextBlock Text="beta" /> <TextBlock Text="gamma" /> </StackPanel> </Border> </Popup> |
Categories: Non classé
Commentaires récents