C# 当鼠标离开WPF表中的当前单元格时,如何添加延迟?

C# 当鼠标离开WPF表中的当前单元格时,如何添加延迟?,c#,wpf,events,mousehover,timedelay,C#,Wpf,Events,Mousehover,Timedelay,我需要帮助编写一个延迟代码,以便在鼠标离开表格中的单元格时为鼠标悬停添加效果。 当鼠标进入单元格时,它会将边框着色为绿色。当它离开电池时,颜色必须在1秒内慢慢褪色回原来的颜色(银色)。在此期间,用户必须能够不间断地悬停在其他单元格上。以下是我迄今为止所尝试的: //cell hover effects System.Timers.Timer timer = new System.Timers.Timer(1); TableCell tc;

我需要帮助编写一个延迟代码,以便在鼠标离开表格中的单元格时为鼠标悬停添加效果。 当鼠标进入单元格时,它会将边框着色为绿色。当它离开电池时,颜色必须在1秒内慢慢褪色回原来的颜色(银色)。在此期间,用户必须能够不间断地悬停在其他单元格上。以下是我迄今为止所尝试的:

        //cell hover effects
        System.Timers.Timer timer = new System.Timers.Timer(1);
        TableCell tc;
        private void cell_MouseEnter(object sender, MouseEventArgs e)
        {
            tc = (TableCell)sender;
            tc.BorderBrush = Brushes.Green; 
        }

        private void cell_MouseLeave(object sender, MouseEventArgs e)
        {
            tc = (TableCell)sender;

            timer.Start();         
            timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);

            tc.BorderBrush = Brushes.Silver;
        }
        private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            tc.BorderBrush = Brushes.Silver;
            timer.Stop();
        }
由于另一个线程正在处理当前单元格,因此当我移动到另一个单元格时,此代码会给我一个错误。有人能帮我解决这个问题,或者告诉我一个更好的方法来实现这个目标吗

需要C#代码解决方案,而不是XAML

完整代码供参考:

public partial class MainWindow : Window
   {
        public MainWindow()
        {
            InitializeComponent();
            InitTable();
        }

        private void InitTable()
        {
            //Canvas task1Canvas = new Canvas();
            Table symptomTable = new Table();
            //task1Canvas.Children.Add(symptomTable);

            FlowDocument flowDoc = new FlowDocument();

            flowDoc.Blocks.Add(symptomTable);
            //symptomTable.CellSpacing = 128;

            // Create N columns and add them to the table's Columns collection.
            int numOfCols = 14;
            for (int i = 0; i < numOfCols; i++)
            {
                symptomTable.Columns.Add(new TableColumn());
                symptomTable.Columns[i].Width = new GridLength(128); //cell width
            }

            // Create and add an empty TableRowGroup Rows.
            symptomTable.RowGroups.Add(new TableRowGroup());

            //Add the first row to the table
            symptomTable.RowGroups[0].Rows.Add(new TableRow());
            //Configure the table head row
            TableRow currentRow = symptomTable.RowGroups[0].Rows[0];

            // Add the header row with content,
            currentRow.Cells.Add(new TableCell(new Paragraph(new Run("August"))));
            for (int n = 1; n <= 13; n++)
               currentRow.Cells.Add(new TableCell(new Paragraph(new Run((10+n).ToString()))));

            //Add the remaining rows
            int row = 1;
            string[] rowHeaders = new string[] { "river", "explosion", "flu", "airport", "chills", "morning", "tech", "truck", "cold" };
            foreach (string label in rowHeaders)
            {
                symptomTable.RowGroups[0].Rows.Add(new TableRow());
                //Configure the table head row
                currentRow = symptomTable.RowGroups[0].Rows[row++];
                // Add the header row with content,
                currentRow.Cells.Add(new TableCell(new Paragraph(new Run(label))));
                for (int n = 1; n <= 13; n++)
                    currentRow.Cells.Add(new TableCell(new Paragraph(new Run(""))));

                for (int n = 1; n < currentRow.Cells.Count; n++)
                {
                    currentRow.Cells[n].BorderThickness = new Thickness(3, 3, 3, 3);
                    currentRow.Cells[n].BorderBrush = Brushes.Silver;

                    currentRow.Cells[n].MouseEnter += new MouseEventHandler(cell_MouseEnter);
                    if(label != "chills")
                        currentRow.Cells[n].MouseLeave += new MouseEventHandler(cell_MouseLeave);
                }
            }

            //Add the given flow document to the window
            this.Content = flowDoc; 
        }

        //cell hover effects
        System.Timers.Timer timer = new System.Timers.Timer(1);
        TableCell tc;
        Thread animatationThread;
        private void cell_MouseEnter(object sender, MouseEventArgs e)
        {
            tc = (TableCell)sender;
            //Color colour = System.Drawing.ColorTranslator.FromHtml("#66CC00");
            Color greenShade = (Color)ColorConverter.ConvertFromString("#FF66CC00");
            BrushConverter converter = new BrushConverter();
            Brush brush = converter.ConvertFromString("#FF66CC00") as Brush;
            tc.BorderBrush = brush;
            //System.Threading.Thread animationThread = new System.Threading.Thread();
            //animatationThread = new Thread(new ThreadStart(brush.BeginAnimation(SolidColorBrush.ColorProperty, new System.Windows.Media.Animation.ColorAnimation(Colors.Silver, TimeSpan.FromSeconds(1)))));
            //brush.BeginAnimation(SolidColorBrush.ColorProperty, new System.Windows.Media.Animation.ColorAnimation(Colors.Silver, TimeSpan.FromSeconds(1)));
        }

        private void cell_MouseLeave(object sender, MouseEventArgs e)
        {
            //TableCell tc;
            tc = (TableCell)sender;


            //timer.Start();         
            //timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);

            tc.BorderBrush = Brushes.Silver;
        }
        private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            tc.BorderBrush = Brushes.Silver;
            timer.Stop();
        }

    }
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
InitTable();
}
私有void InitTable()
{
//Canvas task1Canvas=新画布();
表SYMBOL Table=新表();
//Task1 Canvas.Children.Add(症状表);
FlowDocument flowDoc=新的FlowDocument();
flowDoc.Blocks.Add(症状表);
//symptomTable.CellSpacing=128;
//创建N列并将它们添加到表的columns集合中。
int numocols=14;
for(int i=0;i对于(int n=1;n您可能不需要任何代码来实现相同的功能,您可以通过XAML声明性地实现

我用动画达到了预期的效果

范例


项目1
项目2
项目3
项目4
尝试上面的例子,当鼠标进入时,颜色会变为绿色,离开时会慢慢变为银色。也可以不间断地将鼠标进入其他单元格,甚至同一单元格


更新

这就是在c语言中实现相同功能的方法#

你不需要任何定时器,动画将为你工作,并将慢慢淡入银色

更新2

基于您的代码,并假设
FlowDocument
不是必需的,我提出了一个替代解决方案

一切都是暗藏的

    private void InitTable()
    {
        int numOfCols = 14;
        UniformGrid grid = new UniformGrid();

        grid.Columns = numOfCols;

        grid.Children.Add(new TextBlock() { Text = "August", FontWeight = FontWeights.Bold });
        for (int n = 1; n < numOfCols; n++)
            grid.Children.Add(new TextBlock() { Text = (10 + n).ToString(), FontWeight = FontWeights.Bold });

        string[] rowHeaders = new string[] { "river", "explosion", "flu", "airport", "chills", "morning", "tech", "truck", "cold" };
        Style cellStyle = PrepareAnimationStyle();
        foreach (string label in rowHeaders)
        {
            grid.Children.Add(new TextBlock() { Text = label, FontWeight = FontWeights.Bold });
            for (int n = 1; n < numOfCols; n++)
                grid.Children.Add(new Border()
                {
                    BorderBrush = new SolidColorBrush(Colors.Silver),
                    Background = Brushes.Transparent,
                    BorderThickness = new Thickness(3),
                    Style = cellStyle
                });
        }

        this.Content = grid;
    }

    Style PrepareAnimationStyle()
    {
        Trigger animTrigger = new Trigger();
        animTrigger.Property = ContentElement.IsMouseOverProperty;
        animTrigger.Value = true;

        ColorAnimation toGreen = new ColorAnimation((Color)ColorConverter.ConvertFromString("#FF66CC00"), TimeSpan.FromSeconds(0));
        toGreen.FillBehavior = FillBehavior.HoldEnd;
        ColorAnimation toSilver = new ColorAnimation(Colors.Silver, TimeSpan.FromSeconds(1));

        Storyboard sbEnter = new Storyboard();
        Storyboard.SetTargetProperty(toGreen, new PropertyPath("BorderBrush.Color"));
        sbEnter.Children.Add(toGreen);

        Storyboard sbExit = new Storyboard();
        Storyboard.SetTargetProperty(toSilver, new PropertyPath("BorderBrush.Color"));
        sbExit.Children.Add(toSilver);

        animTrigger.EnterActions.Add(new BeginStoryboard() { Storyboard = sbEnter });
        animTrigger.ExitActions.Add(new BeginStoryboard() { Storyboard = sbExit });

        Style cellStyle = new Style();
        cellStyle.Triggers.Add(animTrigger);

        return cellStyle;
    }
private void InitTable()
{
int numocols=14;
UniformGrid grid=新的UniformGrid();
grid.Columns=numocols;
Add(newtextblock(){Text=“August”,fontwweight=fontwweights.Bold});
对于(int n=1;n    private void InitTable()
    {
        int numOfCols = 14;
        UniformGrid grid = new UniformGrid();

        grid.Columns = numOfCols;

        grid.Children.Add(new TextBlock() { Text = "August", FontWeight = FontWeights.Bold });
        for (int n = 1; n < numOfCols; n++)
            grid.Children.Add(new TextBlock() { Text = (10 + n).ToString(), FontWeight = FontWeights.Bold });

        string[] rowHeaders = new string[] { "river", "explosion", "flu", "airport", "chills", "morning", "tech", "truck", "cold" };
        Style cellStyle = PrepareAnimationStyle();
        foreach (string label in rowHeaders)
        {
            grid.Children.Add(new TextBlock() { Text = label, FontWeight = FontWeights.Bold });
            for (int n = 1; n < numOfCols; n++)
                grid.Children.Add(new Border()
                {
                    BorderBrush = new SolidColorBrush(Colors.Silver),
                    Background = Brushes.Transparent,
                    BorderThickness = new Thickness(3),
                    Style = cellStyle
                });
        }

        this.Content = grid;
    }

    Style PrepareAnimationStyle()
    {
        Trigger animTrigger = new Trigger();
        animTrigger.Property = ContentElement.IsMouseOverProperty;
        animTrigger.Value = true;

        ColorAnimation toGreen = new ColorAnimation((Color)ColorConverter.ConvertFromString("#FF66CC00"), TimeSpan.FromSeconds(0));
        toGreen.FillBehavior = FillBehavior.HoldEnd;
        ColorAnimation toSilver = new ColorAnimation(Colors.Silver, TimeSpan.FromSeconds(1));

        Storyboard sbEnter = new Storyboard();
        Storyboard.SetTargetProperty(toGreen, new PropertyPath("BorderBrush.Color"));
        sbEnter.Children.Add(toGreen);

        Storyboard sbExit = new Storyboard();
        Storyboard.SetTargetProperty(toSilver, new PropertyPath("BorderBrush.Color"));
        sbExit.Children.Add(toSilver);

        animTrigger.EnterActions.Add(new BeginStoryboard() { Storyboard = sbEnter });
        animTrigger.ExitActions.Add(new BeginStoryboard() { Storyboard = sbExit });

        Style cellStyle = new Style();
        cellStyle.Triggers.Add(animTrigger);

        return cellStyle;
    }