我在UserControl中有一个弹出控件:
<UserControl ....>
<Popup x:Name="popUp" IsOpen="False" AllowsTransparency="True" LostFocus="popUp_LostFocus">
....
</Popup>
</UserControl>
弹出窗口有一个LostFocus事件:
private void popUp_LostFocus(object sender, RoutedEventArgs e)
{
...
}
但是当我在一个窗口中使用用户控件并且弹出窗口失去焦点时,该事件无效。
答案 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; }
}
}