-1

始める前に、これを言わなければなりません。この質問を読みました。そして、数時間前に投稿したこの質問の複製であることがわかりません。

私の元の投稿はそのままです:

さまざまなフォルダーの画像を表示するために、WPF でいくつかのボタンを使用しています。Clickすべてのボタンのモードは ですHover。一部のボタンでは、ホバリング後に function にルーティングされます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# の初心者です。したがって、最小限の実用的な例を投稿できれば、実際に非常に感謝しています。

4

4 に答える 4

2

これがあなたのためのサンプルアプリケーションです。

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

}
于 2012-10-16T11:07:04.827 に答える
2

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>
于 2012-10-16T11:19:06.577 に答える
0

メソッドでは使用できません。

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

必要なロジックを正確には理解していませんが、これらの 2 つのクラスとイベントを使用すると、必要なことを実行できると思います。

于 2012-10-16T11:21:12.120 に答える
0

これは、任意の数のボタンで問題なく動作するようです...

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);
        }
    }
于 2012-10-16T12:04:33.843 に答える