国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

WPF --- 觸摸屏下的兩個問題

這篇具有很好參考價值的文章主要介紹了WPF --- 觸摸屏下的兩個問題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

引言

本片文章分享一下之前遇到的WPF應(yīng)用在觸摸屏下使用時的兩個問題。

場景

具體場景就是一個配置界面, ScrollViewer 中包含一個StackPanel 然后縱向堆疊,已滾動的方式查看,然后包含多個 TextBlockTextBox 以及DataGrid ,期間遇到了兩個問題:

  • WPF在觸摸屏下,如果有滾動條(ScrollViewer)的情況下,默認(rèn)包含觸底反饋的功能,就是觸摸屏滑動到底或從底滑到頂,界面都會出現(xiàn)抖動的情況。
  • 觸摸屏下,當(dāng)觸點處于 DataGrid 中時,無法滾動界面。

大概像這樣:
WPF --- 觸摸屏下的兩個問題

解決方案

觸底反饋抖動的問題

先來看第一個問題,這個其實是由于 ManipulationBoundaryFeedback 這個事件引起的:

最簡單的做法,就是在對應(yīng)包含ScrollViewer 的 UI 元素綁定它的反饋事件,然后在注冊方法中設(shè)置 e.Handled = true; ,這樣中斷了事件繼續(xù)冒泡或隧道傳播,比如這樣

// 在Xaml中,在對應(yīng)的 UIElement 上綁定ManipulationBoundaryFeedback="UIElement_ManipulationBoundaryFeedback"

//Code-Behind中 ,
private void UIElement_ManipulationBoundaryFeedback(object sender, ManipulationBoundaryFeedbackEventArgs e)
{
    e.Handled = true;
}

但是這樣就需要你在每一個界面都添加該事件,代碼冗余,那么就可以使用附加屬性的方式,寫一個 ManipulationBoundaryFeedbackAttachedProperties,各個界面直接使用,像這樣實現(xiàn):

public class ManipulationBoundaryFeedbackAttachedProperties
{
    public static bool GetIsFeedback(DependencyObject obj)
    {
        return (bool)obj.GetValue(IsFeedbackProperty);
    }
    public static void SetIsFeedback(DependencyObject obj, bool value)
    {
        obj.SetValue(IsFeedbackProperty, value);
    }
    public static readonly DependencyProperty IsFeedbackProperty =
        DependencyProperty.RegisterAttached("IsFeedback", typeof(bool), typeof(UIElement), new PropertyMetadata(true,
            (s, e) =>
            {
                var target = s as UIElement;
                if (target != null)
                    target.ManipulationBoundaryFeedback += Target_ManipulationBoundaryFeedback;
            }));

    private static void Target_ManipulationBoundaryFeedback(object sender, ManipulationBoundaryFeedbackEventArgs e)
    {
        var target = sender as UIElement;
        if (target != null)
        {
            if (!GetIsFeedback(target))
            {
                e.Handled = true;
            }
        }
    }
}

像這樣使用:

 <ScrollViewer local:ManipulationBoundaryFeedbackAttachedProperties.IsFeedback="true">
     ...
 </ScrollViewer>    

這樣就完美解決了!

觸點在DataGrid中無法滾動的問題

這個問題,其實不光在 DataGrid中有,觸點在 TextBox 、ListView、ListBox,這一類內(nèi)置有 ScrollViewer 的控件內(nèi),都有同樣的問題,而且不光是觸摸屏無法滾動,鼠標(biāo)滑輪也無法滾動。我處理這個問題的時候,是先處理的鼠標(biāo)滑輪無法滾動,處理方案就是根據(jù)鼠標(biāo)的偏移量,手動設(shè)置 ScrollViewer 的位置,如下:

private void DataGrid_MouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
{
    var dataGrid = (DataGrid)sender;
    // 獲取
    var scrollViewer = GetScrollViewer(dataGrid);

    if (scrollViewer != null)
    {
        if (scrollViewer.ViewportHeight + scrollViewer.VerticalOffset >= scrollViewer.ExtentHeight && e.Delta <= 0)
        {
            scrollViewer.LineDown();
        }
        else if (scrollViewer.VerticalOffset == 0 && e.Delta >= 0)
        {
            scrollViewer.LineUp();
        }
    }
}

public ScrollViewer GetScrollViewer(UIElement element)
{
    if (element == null) return null;

    ScrollViewer retour = null;
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element) && retour == null; i++)
    {
        if (VisualTreeHelper.GetChild(element, i) is ScrollViewer)
        {
            retour = (ScrollViewer)(VisualTreeHelper.GetChild(element, i));
        }
        else
        {
            retour = GetScrollViewer(VisualTreeHelper.GetChild(element, i) as UIElement);
        }
    }
    return retour;
}

這樣就解決了,當(dāng)鼠標(biāo)位于 DataGrid 中時,使用滑輪界面無法滾動的問題,那么解決觸摸屏觸點在 DataGrid 中無法滾動的問題,也是一樣的思路,根據(jù)觸點的偏移量,模擬鼠標(biāo)滾輪的偏移量,在調(diào)用鼠標(biāo)滾動事件,模擬滾動,代碼如下:

private const double TouchMoveThreshold = 20; // 觸摸滾動的閾值

private Point lastTouchPosition; // 上一次觸摸的位置

private void DataGrid_PreviewTouchMove(object sender, System.Windows.Input.TouchEventArgs e)
{
    // 獲取當(dāng)前觸摸位置
    Point currentTouchPosition = e.GetTouchPoint((IInputElement)sender).Position;

    // 計算觸摸移動的差值
    double deltaY = currentTouchPosition.Y - lastTouchPosition.Y;

    // 如果觸摸移動超過閾值,則模擬鼠標(biāo)滾動
    if (Math.Abs(deltaY) > TouchMoveThreshold)
    {
        // 設(shè)置鼠標(biāo)滾動的差值
        int mouseWheelDelta = (int)(deltaY / TouchMoveThreshold) * SystemParameters.WheelScrollLines;

        // 創(chuàng)建模擬的鼠標(biāo)滾動事件參數(shù)
        var mouseWheelEventArgs = new MouseWheelEventArgs(Mouse.PrimaryDevice, Environment.TickCount, mouseWheelDelta);
        mouseWheelEventArgs.RoutedEvent = UIElement.MouseWheelEvent;

        DataGrid_MouseWheel(sender, mouseWheelEventArgs);
        // 更新上一次觸摸位置
        lastTouchPosition = currentTouchPosition;
    }
}

這樣,觸摸屏下,觸點在 DataGrid 中無法滾動的問題,就解決了。

小結(jié)

總的來說,大部分鼠標(biāo)和觸摸屏事件是類似的,但是有些場景下,可能兩者不通用的。所以可能需要自行測試一下,保證軟件的穩(wěn)定性。

本文中的解決方案不一定最完美的解決方案,如果各位看官有更好的解決方案,望不吝賜教。文章來源地址http://www.zghlxwxcb.cn/news/detail-837926.html

到了這里,關(guān)于WPF --- 觸摸屏下的兩個問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【ChatGpt】ChatGpt解答了 “我一下午都沒解決的“ Linux觸摸屏驅(qū)動的問題

    【ChatGpt】ChatGpt解答了 “我一下午都沒解決的“ Linux觸摸屏驅(qū)動的問題

    現(xiàn)實問題: 有一個基于Linux4.19內(nèi)核開發(fā)了,在海思SS528芯片運行的系統(tǒng),用鼠標(biāo)可以正常使用。 現(xiàn)在要求使用一塊公司開發(fā)的 多點觸控屏 連接這個系統(tǒng),能正常使用。 分析問題: 要在LInux系統(tǒng)使用觸控屏,可能需要移植 tslib 的庫,這個有以前做過,可以自己解決。 移植后

    2024年02月07日
    瀏覽(22)
  • 應(yīng)用在手機(jī)觸摸屏中的電容式觸摸芯片

    應(yīng)用在手機(jī)觸摸屏中的電容式觸摸芯片

    觸控屏(Touch panel)又稱為觸控面板,是個可接收觸頭等輸入訊號的感應(yīng)式液晶顯示裝置,當(dāng)接觸了屏幕上的圖形按鈕時,屏幕上的觸覺反饋系統(tǒng)可根據(jù)預(yù)先編程的程式驅(qū)動各種連結(jié)裝置,可用以取代機(jī)械式的按鈕面板,并借由液晶顯示畫面制造出生動的影音效果。 手機(jī)觸摸

    2024年02月07日
    瀏覽(27)
  • 應(yīng)用在游戲機(jī)觸摸屏中的觸摸感應(yīng)芯片

    應(yīng)用在游戲機(jī)觸摸屏中的觸摸感應(yīng)芯片

    觸屏游戲機(jī)的屏幕是由液晶屏和觸控層組成的。觸控層分為電容式觸屏和電阻式觸屏兩種。電容式觸屏是將懸空電極和屏幕玻璃上的電極組成靜電場,當(dāng)人體接近屏幕時,就會改變靜電場分布,從而實現(xiàn)觸摸的位置探測。而電阻式觸屏則是利用玻璃上的兩層電極之間通電形成一個

    2024年01月18日
    瀏覽(31)
  • 基于GEC6818的觸摸屏

    基于GEC6818的觸摸屏

    連接操作系統(tǒng)的輸入設(shè)備,可不止一種,也許是一個標(biāo)準(zhǔn)PS/2鍵盤,也許是一個USB鼠標(biāo),或者是一塊觸摸屏,甚至是一個游戲機(jī)搖桿,Linux在處理這些紛繁各異的輸入設(shè)備的時候,采用的辦法還是找中間層來屏蔽各種細(xì)節(jié),請看下圖: 在Linux的內(nèi)核中,對輸入設(shè)備的使用,實際

    2024年02月05日
    瀏覽(22)
  • ESP32開發(fā)---驅(qū)動觸摸屏

    ESP32開發(fā)---驅(qū)動觸摸屏

    采用 I2C 驅(qū)動觸摸屏。 I2C 多用于主控制器和從器件間的主從通信,在小數(shù)據(jù)量場合使用,傳輸距離短,任意時刻只能有一個主機(jī)等特性。 它有兩條線,一條是 SCL (串行時鐘總線),另外一條是SDA(串行數(shù)據(jù)線),這兩條數(shù)據(jù)需要接上拉電阻,總線空閑的時候SCL和SDA處于高電

    2024年02月08日
    瀏覽(25)
  • Linux 多點電容觸摸屏實驗

    Linux 多點電容觸摸屏實驗

    1、多點觸摸(MT)協(xié)議詳解 電容觸摸屏驅(qū)動其實就是以下幾種 linux 驅(qū)動框架的組合: ①、IIC 設(shè)備驅(qū)動,因為電容觸摸 IC 基本都是 IIC 接口的,因此大框架就是 IIC 設(shè)備驅(qū)動。 ②、通過中斷引腳(INT)向 linux 內(nèi)核上報觸摸信息,因此需要用到 linux 中斷驅(qū)動框架。坐標(biāo)的上報在中斷

    2024年02月06日
    瀏覽(25)
  • Linux 觸摸屏 (IIC驅(qū)動詳解)

    Linux 觸摸屏 (IIC驅(qū)動詳解)

    本文使用觸摸屏iic驅(qū)動,驅(qū)動編寫中要使用 總線,設(shè)備,驅(qū)動 分層的思想,IIC總線,觸摸屏驅(qū)動,觸摸屏設(shè)備, ? 一般 SOC 的 I2C 總線驅(qū)動都是由半導(dǎo)體廠商編寫的,比如 I.MX6U 的 I2C 適配器驅(qū)動 NXP 已經(jīng)編寫好了,這個不需要用戶去編寫。因此 I2C 總線驅(qū)動對我們這些 SOC 使

    2023年04月11日
    瀏覽(29)
  • 電容觸摸屏驅(qū)動(Linux驅(qū)動開發(fā)篇)

    電容觸摸屏驅(qū)動(Linux驅(qū)動開發(fā)篇)

    電容屏只需要手指輕觸即可,而電阻屏是需要手指 給予一定的壓力才有反應(yīng),而且電容屏不需要校準(zhǔn)。 如果要做人機(jī)交互設(shè)備的開發(fā),多點電容觸摸屏基本是不可能繞過去的。 正點原子ATK-7016 這款屏幕 其實是由 TFT LCD+觸摸屏組合起來的。底下是 LCD 面板,上面是觸摸面板,

    2024年02月05日
    瀏覽(24)
  • 【威綸通觸摸屏 按鍵保護(hù)(元件安全設(shè)置)】

    【威綸通觸摸屏 按鍵保護(hù)(元件安全設(shè)置)】

    提示:在觸摸屏的設(shè)計中,需要對系統(tǒng)按鍵設(shè)置保護(hù),防止誤操作和非法操作,需要特定的用戶權(quán)限才可以操作。 提示:這里使用的威綸通觸摸屏軟件及版本如下: 1.窗口布局如下,本頁面展示設(shè)備運行時長,在設(shè)備保養(yǎng)或更換主要零部件后,按下重置按鈕重新設(shè)備計算運行

    2024年02月05日
    瀏覽(56)
  • 【Liux下6818開發(fā)板(ARM)】觸摸屏

    【Liux下6818開發(fā)板(ARM)】觸摸屏

    (??? ),hello我是 祐言 博客主頁:C語言基礎(chǔ),Linux基礎(chǔ),軟件配置領(lǐng)域博主?? 快上??,一起學(xué)習(xí)! 送給讀者的一句雞湯??: 集中起來的意志可以擊穿頑石! 作者水平很有限,如果發(fā)現(xiàn)錯誤,可在評論區(qū)指正,感謝?? ? ? ? ? 在正式學(xué)習(xí)觸摸屏之前,我們先來了解一下事件

    2024年02月14日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包