弹出窗口中丢失的焦点事件无法在用户控制中使用wpf

时间:2016-07-04 20:22:21

标签: c# wpf popup

我在UserControl中有一个弹出控件:

<UserControl ....>
<Popup x:Name="popUp" IsOpen="False" AllowsTransparency="True" LostFocus="popUp_LostFocus">
....
</Popup>
</UserControl>

弹出窗口有一个LostFocus事件:

private void popUp_LostFocus(object sender, RoutedEventArgs e)
{
    ...
}

但是当我在一个窗口中使用用户控件并且弹出窗口失去焦点时,该事件无效。

2 个答案:

答案 0 :(得分:1)

在Popup.LogicalChildren上引用MSDN

  

...子内容未添加到包含的可视树中   弹出控件。相反,子内容以a形式呈现   在 IsOpen 属性时具有自己的可视树的单独窗口   设置为true。

由于弹出窗口是在它自己的窗口中生成的,因此它不会失去焦点(对于另一个窗口中的控件)。而是在 IsOpen 属性更改为false时发生关闭事件。

答案 1 :(得分:0)

感谢Funk,但我用ToggleButton解决了:

XAML:

    <UserControl .....
            .....
            xmlns:local="clr-namespace:NameSpace.UserControl">    
                <UserControl.Resources>
                    <ControlTemplate x:Key="IconButton" TargetType="{x:Type ToggleButton}">
                        <Border>
                            <ContentPresenter />
                        </Border>
                    </ControlTemplate>
                    <local:BoolInverter x:Key="BoolInverterConverter"/>
                    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
                </UserControl.Resources>
                <ToggleButton Template="{StaticResource IconButton}" BorderBrush="Transparent" 
    Background="Transparent" Name="PopUpCalendarButton" IsChecked="False" 
IsHitTestVisible="{Binding ElementName=popUp, Path=IsOpen, Mode=OneWay, Converter={StaticResource BoolInverterConverter}}">
                   ......
                </ToggleButton> 
                <Popup x:Name="popUp" IsOpen="{Binding Path=IsChecked, ElementName=PopUpCalendarButton}"  PlacementTarget="{Binding ElementName=PopUpCalendarButton}" AllowsTransparency="True" PopupAnimation="Fade" StaysOpen="False">
                    .....       
                </Popup>
        </UserControl>

C#

namespace NameSpace.UserControl
{
    public partial class UserControlClass: UserControl
    {
     ...........
    }

    public class BoolInverter : MarkupExtension, IValueConverter
    {
        public override object ProvideValue(IServiceProvider serviceProvider)
        { return this; }
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        { return !(bool)value; }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        { return !(bool)value; }
    }
}