【问题标题】:Lost focus event in pop up not working in user control wpf弹出窗口中丢失的焦点事件在用户控件wpf中不起作用
【发布时间】:2016-07-04 20:22:21
【问题描述】:

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

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

弹出窗口有一个 LostFocus 事件:

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

但是当我在窗口中使用用户控件并且弹出窗口失去焦点时,事件不起作用。

【问题讨论】:

    标签: c# wpf popup


    【解决方案1】:

    在 Popup.LogicalChildren 上引用 MSDN:

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

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

    【讨论】:

    • 谢谢,但我解决了,我像自己的答案一样解释解决方案
    【解决方案2】:

    感谢 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; }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-03-15
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多