Autohide Media控制SilverLight播放器

时间:2012-01-19 13:44:13

标签: c# silverlight xaml controls media-player

我试图让我的媒体控件在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();
}

1 个答案:

答案 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;
    }
}

您还需要为取消隐藏做类似的事情。