[英]How to check if mouse is over a button in wpf
在我開始之前,我必須說這個。 我已經讀過這個問題 。 而且我看不到它是幾個小時前發布的這個問題的副本。
我的原始帖子是:
我在WPF中使用了一些按鈕來顯示來自各個文件夾的圖像。 所有按鈕的“ Click
模式為“ Hover
。 對於某些按鈕,將OnButtonClick
懸停后將其路由到函數OnButtonClick
。 我想做的是,只有在鼠標懸停在按鈕上X
秒鍾之后,才應該完成函數OnButtonClick
內的處理。
XAML代碼:
<Button Name="Dresses" MouseEnter="onMouseEnter" MouseLeave="onMouseLeave" Content="Dresses" Grid.Row="2" Height="25" Width="85" VerticalAlignment="Center" Grid.Column="5" FontFamily="Tahoma" FontSize="14" FontWeight="Bold" HorizontalAlignment="Center" Cursor="Hand" ClickMode="Hover">
<Button.Background>
<LinearGradientBrush>
<GradientStop Color="Yellow" Offset="0" />
<GradientStop Color="Green" Offset="1" />
</LinearGradientBrush>
</Button.Background>
</Button>
C#代碼:
private void OnButtonClickDresses(object sender, RoutedEventArgs e)
{
//Code for delay
//Code which should run only if mouse on button after 5 seconds
}
PS:我是WPF和C#的初學者。 因此,如果您能發布一個最低限度的工作示例,我將非常感激。
這是給您的示例應用程序。
using System.Windows.Threading;
namespace MyWPF App
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
DateTime dt;
DispatcherTimer t;
public MainWindow()
{
InitializeComponent();
t = new DispatcherTimer();
t.Tick += new EventHandler(t_Tick);
}
private void button1_MouseEnter(object sender, MouseEventArgs e)
{
dt=DateTime.Now;
t.Interval = new TimeSpan(0, 0, 1);
t.IsEnabled = true;
}
void t_Tick(object sender, EventArgs e)
{
if ((DateTime.Now - dt).Seconds >= 5)
{
MessageBox.Show("Hello");// Here you can put your code which you want to execute after 5 seconds.
}
}
private void button1_MouseLeave(object sender, MouseEventArgs e)
{
t.IsEnabled = false;
}
}
}
您可以使用MouseEnter啟動間隔為X秒的計時器。 在MouseLeave上,您可以停止此計時器。 現在,您將來自OnButtonClickDresses方法的代碼放入Timer_Tick方法中。
樣品:
public partial class MainWindow : Window
{
DispatcherTimer dt;
public MainWindow()
{
InitializeComponent();
dt = new DispatcherTimer();
dt.Interval = new TimeSpan(0, 0, 5);//wait for 5 Seconds
dt.Tick += new EventHandler(dt_Tick);
}
void dt_Tick(object sender, EventArgs e)
{
//do code
}
private void button1_MouseEnter(object sender, MouseEventArgs e)
{
dt.Start();
}
private void button1_MouseLeave(object sender, MouseEventArgs e)
{
dt.Stop();
}
}
編輯:
<Button Name="Dresses" MouseEnter="button1_MouseEnter" MouseLeave="button1_MouseLeave" Content="Dresses" Grid.Row="2" Height="25" Width="85" VerticalAlignment="Center" Grid.Column="5" FontFamily="Tahoma" FontSize="14" FontWeight="Bold" HorizontalAlignment="Center" Cursor="Hand"
<Button.Background>
<LinearGradientBrush>
<GradientStop Color="Yellow" Offset="0" />
<GradientStop Color="Green" Offset="1" />
</LinearGradientBrush>
</Button.Background>
</Button>
您不能在方法中使用它:
System.Threading.Thread.Sleep (5000);
因為這樣會凍結您的界面。
為此,您應該使用某種異步任務。 我建議:
Task.Factory.StartNew (() =>
{
System.Threading.Thread.Sleep (5000);
})
. ContinueWith (() =>
{
/ / Code after 5 seconds
}
TaskScheduler.FromCurrentSynchronizationContext ());
盡管我認為這不是理想的選擇,因為它可以將鼠標移至上方並放回原處。 這會引起混亂。
我推薦的方法:
使用事件MouseEnter和MouseLeave以及類
System.Diagnostics.Stopwatch
System.Windows.Threading.DispatcherTimer
我不完全了解您需要的邏輯,但是我認為通過這兩個類和事件,您可以執行所需的操作。
對於任意數量的按鈕,這似乎都可以正常工作...
XAML:
<Grid>
<Button Name="myButton1" Content="Button 1" HorizontalAlignment="Left" Margin="34,51,0,0" VerticalAlignment="Top" Width="75" Click="HoverButton_Click" MouseEnter="HoverButton_MouseEnter" MouseLeave="HoverButton_MouseLeave"/>
<Button Name="myButton2" Content="Button 2" HorizontalAlignment="Left" Margin="150,51,0,0" VerticalAlignment="Top" Width="75" Click="HoverButton_Click" MouseEnter="HoverButton_MouseEnter" MouseLeave="HoverButton_MouseLeave"/>
<TextBox Name="myTextBox" HorizontalAlignment="Left" Height="147" Margin="34,91,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="232"/>
</Grid>
碼:
private Dictionary<Button, System.Threading.Timer> buttonTimers = new Dictionary<Button, System.Threading.Timer>();
public MainWindow()
{
InitializeComponent();
}
private void HoverTime(object state)
{
var thisButton = state as Button;
thisButton.Dispatcher.BeginInvoke((Action)delegate()
{
thisButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
});
}
private void HoverButton_Click(object sender, RoutedEventArgs e)
{
var button = sender as Button;
myTextBox.Text += "Delayed hover: " + button.Content + Environment.NewLine;
}
private void HoverButton_MouseEnter(object sender, MouseEventArgs e)
{
var thisButton = sender as Button;
var t = new System.Threading.Timer(new TimerCallback(HoverTime), sender, 2500, Timeout.Infinite);
buttonTimers.Add(thisButton, t);
}
private void HoverButton_MouseLeave(object sender, MouseEventArgs e)
{
var thisButton = sender as Button;
if (buttonTimers.ContainsKey(thisButton))
{
buttonTimers[thisButton].Dispose();
buttonTimers.Remove(thisButton);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.