首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WPF 滑鼠座標與 ProgressBar 即時更新兩大技巧

     編輯:關於.NET

一、WPF 取得/設定滑鼠座標

方法 1:純 WPF API (相對元素/螢幕座標)

// 相對特定元素座標
Point p = Mouse.GetPosition(e.Source as FrameworkElement);
// 轉換為螢幕絕對座標
Point screenPoint = (e.Source as FrameworkElement).PointToScreen(p);

方法 2:P/Invoke Windows API (全域螢幕座標/設定游標位置)

[DllImport("User32")] public extern static void SetCursorPos(int x, int y);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool GetCursorPos(out POINT pt);

public struct POINT { public int X; public int Y; public POINT(int x, int y) { X = x; Y = y; } }

private void Window_MouseMove(object sender, MouseEventArgs e) {
    POINT p = new POINT();
    if (GetCursorPos(out p)) {
        txtStat.Text = string.Format("X:{0} Y:{1}", p.X, p.Y);
    }
}

二、ProgressBar 即時更新進度

方法 1:Dispatcher.Invoke 背景優先級迴圈 (無需額外執行緒)

private delegate void UpdateProgressBarDelegate(DependencyProperty dp, Object value);
private void Process() {
    ProgressBar1.Minimum = 0;
    ProgressBar1.Maximum = short.MaxValue;
    ProgressBar1.Value = 0;
    double value = 0;
    UpdateProgressBarDelegate updatePbDelegate = new UpdateProgressBarDelegate(ProgressBar1.SetValue);
    do {
        value += 1;
        Dispatcher.Invoke(updatePbDelegate, DispatcherPriority.Background,
                          new object[] { ProgressBar.ValueProperty, value });
    } while (ProgressBar1.Value != ProgressBar1.Maximum);
}
  • 關鍵在於 DispatcherPriority.Background 讓 UI 執行緒有機會處理 Render 排程
  • 適用於短時間同步運算需即時回饋進度的場景

方法 2:DispatcherTimer 定時遞增 (非阻塞、適合長時間任務)

public Window1() {
    InitializeComponent();
    DispatcherTimer _mainTimer = new DispatcherTimer();
    _mainTimer.Interval = TimeSpan.FromSeconds(1);
    _mainTimer.Tick += _mainTimer_Tick;
    _mainTimer.IsEnabled = true;
}
void _mainTimer_Tick(object sender, EventArgs e) {
    if (progressBar2.Value == progressBar1.Maximum) progressBar2.Value = 0;
    progressBar2.Value++;
}
  • 不阻塞 UI 執行緒,適合周期性輪詢或長時間後台任務配合 BackgroundWorker/Task 更新進度

XAML 共用定義

<ProgressBar Grid.Row="1" Height="20" Width="200" Margin="0,4,0,0"
             Name="ProgressBar1" HorizontalAlignment="Center" VerticalAlignment="Top" />

總結

滑鼠座標取得:WPF API 適合相對元素定位,P/Invoke 適合全域/跨進程座標。ProgressBar 更新:Dispatcher.Invoke(Background) 解決同步運算阻塞 UI 不重繪問題;DispatcherTimer 適合非阻塞週期性更新。根據任務性質選擇恰當模式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved