我使用扩展器控件创建了某种滑出式面板,其中包含一些过滤选项。用户可以选择将此扩展器“固定”到视图。一切顺利,但现在我想知道当用户单击扩展器外的某个位置时,如何让扩展器自动关闭。我尝试了 LostFocus 和其他几个活动,但无济于事。当用户点击其他地方时,哪个事件可以通知我?
(目前我只是使用一个计时器,它会在鼠标离开扩展器后 +- 2 秒后关闭扩展器,但我更喜欢其他解决方案)
提前致谢。
我使用扩展器控件创建了某种滑出式面板,其中包含一些过滤选项。用户可以选择将此扩展器“固定”到视图。一切顺利,但现在我想知道当用户单击扩展器外的某个位置时,如何让扩展器自动关闭。我尝试了 LostFocus 和其他几个活动,但无济于事。当用户点击其他地方时,哪个事件可以通知我?
(目前我只是使用一个计时器,它会在鼠标离开扩展器后 +- 2 秒后关闭扩展器,但我更喜欢其他解决方案)
提前致谢。
假设你Expander
的名字是“yourExpander”,你可以这样做:
<Window PreviewMouseDown="Window_PreviewMouseDown"
如果e.OriginalSource
不是扩展器的后代,请关闭扩展器:
private void Window_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
Visual visual = e.OriginalSource as Visual;
if (!visual.IsDescendantOf(yourExpander))
yourExpander.IsExpanded = false;
}
为了让我的用户在鼠标悬停在扩展器的任何部分上时自动展开扩展器,并在没有时将其关闭,我使用了以下代码;
在 viewModel 中添加一个 MenuIsVisible 属性、一个 closeMenu 方法、一个 openMenu 方法和 2 个 ICommand;CloseExpanderCommand 和 OpenExpanderCommand
public class TripsViewModel : ViewModelBase
{
private bool _menuIsVisible;
public bool MenuIsVisible
{
get=>_menuIsVisible;
set
{
if (value == _menuIsVisible) { return;}
_menuIsVisible = value;
RaisePropertyChanged();
}
}
private void CloseExpander() { MenuIsVisible = false;}
private void OpenExpander() { MenuIsVisible = true;}
public ICommand CloseExpanderCommand { get; }
public ICommand OpenExpanderCommand { get; }
在您看来:确保您参考:
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
然后
<Border >
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseEnter">
<i:InvokeCommandAction Command="{Binding OpenExpanderCommand}" />
</i:EventTrigger>
<i:EventTrigger EventName="MouseLeave">
<i:InvokeCommandAction Command="{Binding CloseExpanderCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
<Expander Tag="Menu"
ExpandDirection="Right"
Header="Menu"
IsExpanded="{Binding MenuIsVisible}">
<StackPanel>
</StackPanel>
</Expander>
</Border>
事件触发器是魔法发生的地方。