我试图让我的媒体控件在2秒后自动隐藏。然而,我设置它的方式是它只有当我的鼠标离开StackPanel我才能使用媒体控件。如果我继续移动进出StackPanel然后它会开始闪烁,因为它触发了隐藏甚至多次。我不确定如何从逻辑上解决这个问题。有人有任何提示或建议吗?
这是我现在得到的(StackPanel被命名为控件)。
...
controls.MouseMove += new MouseEventHandler(control_unhide);
controls.MouseLeave += new MouseEventHandler(control_hide);
...
void control_hide(object sender, MouseEventArgs e)
{
var miniTimer = new DispatcherTimer() { Interval = TimeSpan.FromSeconds(2) };
miniTimer.Tick += (s, i) => { miniTimer.Stop(); controls.Opacity = 0; };
miniTimer.Start();
}
//Unhide controls
void control_unhide(object sender, MouseEventArgs e)
{
controls.Opacity = 100;
}
同样从一些示例代码我看到人们说使用Collapse和Visible来使控件隐藏并重新出现。然而,这不起作用,因为折叠似乎使边界对鼠标进入没有响应。
谢谢!
* *编辑
我问了这个问题,因为我昨天花了很多时间试图解决这个问题,只是今天坐下来想想一个非常简单的解决方案。我做的是这个:
//global
private DispatcherTimer hideTimer;
....
//init
hideTimer = new DispatcherTimer() { Interval = TimeSpan.FromSeconds(2) };
hideTimer.Tick += (s, i) => { hideTimer.Stop(); controls.Opacity = 0; };
hideTimer.Start();
controls.MouseMove += new MouseEventHandler(control_unhide);
controls.MouseLeave += new MouseEventHandler(control_hide);
...
void control_hide(object sender, MouseEventArgs e)
{
hideTimer.Start();
}
//Unhide controls
void control_unhide(object sender, MouseEventArgs e)
{
controls.Opacity = 100;
hideTimer.Stop();
}
答案 0 :(得分:1)
一个简单的解决方案是放入一个保护变量,只有在你当前没有隐藏时才隐藏:
bool currentlyHiding;
void control_hide(object sender, MouseEventArgs e)
{
if (!currentlyHiding)
{
var miniTimer = new DispatcherTimer() { Interval = TimeSpan.FromSeconds(2) };
miniTimer.Tick += (s, i) =>
{
miniTimer.Stop();
controls.Opacity = 0;
currentlyHiding = false;
};
miniTimer.Start();
currentlyHiding = true;
}
}
您还需要为取消隐藏做类似的事情。