Wpf Dispatcher.BeginInvoke((Action)delegate{}));

来源:https://www.cnblogs.com/Fred1987/archive/2019/11/27/11945976.html
-Advertisement-
Play Games

private void ClickCmdExecuted(object obj) { ContentOb = new ObservableCollection<string>(); Task.Run(() => { while (!cts.IsCancellationRequested) { Co ...


<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Button Grid.Row="0" Grid.Column="0" Command="{Binding ClickCmd}" Content="Click Cmd"/>
        <Button Grid.Row="0" Grid.Column="1" Command="{Binding CancelCmd}" Content="Cancel Cmd"/>
        <ListBox Grid.Row="1" BorderBrush="Black" BorderThickness="3" Grid.RowSpan="2" ItemsSource="{Binding ContentOb,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
    </Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace WpfApplication1.Model
{
    public class DelegateCommand : ICommand
    {
        private readonly Predicate<object> _canExecute;
        private readonly Action<object> _execute;

        public event EventHandler CanExecuteChanged;

        public DelegateCommand(Action<object> execute)
                       : this(execute, null)
        {
        }

        public DelegateCommand(Action<object> execute,
                       Predicate<object> canExecute)
        {
            _execute = execute;
            _canExecute = canExecute;
        }

        public  bool CanExecute(object parameter)
        {
            if (_canExecute == null)
            {
                return true;
            }

            return _canExecute(parameter);
        }

        public  void Execute(object parameter)
        {
            _execute(parameter);
        }

        public void RaiseCanExecuteChanged()
        {
            if (CanExecuteChanged != null)
            {
                CanExecuteChanged(this, EventArgs.Empty);
            }
        }
    }
}
 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using WpfApplication1.Model;
using System.Collections.ObjectModel;
using System.Threading;
using System.Windows; 
using System.IO;
using Newtonsoft.Json;

namespace WpfApplication1.ViewModel
{
    public class WpfVM : INotifyPropertyChanged
    {
        private WpfVM()
        {

        }
        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string propName)
        {
            var handler = PropertyChanged;
            if(handler!=null)
            {
                handler?.Invoke(this, new PropertyChangedEventArgs(propName));
            }
        }

        private static WpfVM Wpfvm;
        private static readonly object objLock = new object();
        public static WpfVM GetWpfVM()
        {
            lock(objLock)
            {
                if(Wpfvm == null)
                {
                    Wpfvm = new WpfVM();
                }
                return Wpfvm;
            }
        }

        private static CancellationTokenSource cts=new CancellationTokenSource();

        #region Commands
        private DelegateCommand ClickCmdValue;
        public DelegateCommand ClickCmd
        {
            get
            {
                if(ClickCmdValue==null)
                {
                    ClickCmdValue = new DelegateCommand(ClickCmdExecuted);
                }
                return ClickCmdValue;
            }
        }

        private string ContentValue;
        public string Content
        {
            get
            {
                return ContentValue;
            }
            set
            {
                if(value!=ContentValue)
                {
                    ContentValue = value;
                    OnPropertyChanged("Content");
                }
            }
        }


        private bool IsCancelledValue=false;
        public bool IsCancelled
        {
            get
            {
                return IsCancelledValue;
            }
            set
            {
                if(value!=IsCancelledValue)
                {
                    IsCancelledValue = value;
                    OnPropertyChanged("IsCancelled");
                }
            }
        }
        private void ClickCmdExecuted(object obj)
        {
            ContentOb = new ObservableCollection<string>();
            Task.Run(() =>
            {
                while (!cts.IsCancellationRequested)
                {
                    Content = DateTime.Now.ToString("yyyyMMddHHmmssffff");
                    App.Current.Dispatcher.BeginInvoke((Action)delegate
                    {
                        ContentOb.Add(Content);
                    });
                    System.Diagnostics.Debug.WriteLine(Content);
                }
            },cts.Token);                      
        }

        private DelegateCommand CancelCmdValue;
        public DelegateCommand CancelCmd
        {
            get
            {
                if(CancelCmdValue==null)
                {
                    CancelCmdValue = new DelegateCommand(CancelCmdValueExecuted);
                }
                return CancelCmdValue;
            }
        }

        private void CancelCmdValueExecuted(object obj)
        {
            cts.Cancel();
            IsCancelled = true;
            System.Diagnostics.Debug.WriteLine("Cancelled!");
            string msJsonSerializerString = JsonConvert.SerializeObject(ContentOb,Formatting.Indented);
            string fileName = DateTime.Now.ToString("yyyyMMddHHmmssffff") + ".txt";
            using(StreamWriter streamWriter=new StreamWriter(fileName,true,Encoding.UTF8))
            {
                streamWriter.WriteLine(msJsonSerializerString);
            }
        }
        #endregion

        #region Properties
        private ObservableCollection<string> ContentObValue;
        public ObservableCollection<string> ContentOb
        {
            get
            {                 
                return ContentObValue;
            }
            set
            {
                if(value!=ContentObValue)
                {
                    ContentObValue = value;
                    OnPropertyChanged("ContentOb");
                }
            }
        }
        #endregion
    }
}
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Windows;
 7 using System.Windows.Controls;
 8 using System.Windows.Data;
 9 using System.Windows.Documents;
10 using System.Windows.Input;
11 using System.Windows.Media;
12 using System.Windows.Media.Imaging;
13 using System.Windows.Navigation;
14 using System.Windows.Shapes;
15 using WpfApplication1.ViewModel;
16 
17 namespace WpfApplication1
18 {
19     /// <summary>
20     /// Interaction logic for MainWindow.xaml
21     /// </summary>
22     public partial class MainWindow : Window
23     {
24         public MainWindow()
25         {
26             InitializeComponent();
27             WpfVM vm = WpfVM.GetWpfVM();
28             this.DataContext = vm;
29         }
30     }
31 }

private void ClickCmdExecuted(object obj)
{
ContentOb = new ObservableCollection<string>();
Task.Run(() =>
{
while (!cts.IsCancellationRequested)
{
Content = DateTime.Now.ToString("yyyyMMddHHmmssffff");
App.Current.Dispatcher.BeginInvoke((Action)delegate
{
ContentOb.Add(Content);
});
System.Diagnostics.Debug.WriteLine(Content);
}
},cts.Token);
}


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ```python import pymysql conn=pymysql.connect(host='localhost',user='root',password='123',db='sg',charset='utf8') #先修路-conn car = conn.cursor() #備車-ca... ...
  • 場景 使用ElementUI的快速開始的項目模板搭建Element項目後, 要在vue頁面中使用jquery的語法。 這裡直接使用$.ajax會提示$找不到。 註: 博客:https://blog.csdn.net/badao_liumang_qizhi關註公眾號霸道的程式猿獲取編程相關電子書、教程 ...
  • 封裝一個資料庫模塊有三個功能:查詢,插入,關閉 1.查看 2.提交 3.關閉 ...
  • 前言 作為一個小白,在學習之前,我非常的明確,自己要學什麼編程語言。 怎麼判斷某門編程語言掉不掉發? 說起掉發,在前言中講過,程式員很多掉發原因都是因為選“錯”了編程語言,接下來讓我們看看編程語言各個撞死人(創始人)的發量是有多麼的恐怖! PHP之父:拉斯馬斯·勒德爾夫 拉斯馬斯·勒德爾夫,創建PH ...
  • 數據結構 數據結構(演算法)的介紹 數據結構的介紹 1) 數據結構是一門研究演算法的學科,只從有了編程語言也就有了數據結構.學好數據結構可以編寫 出更加漂亮,更加有效率的代碼。 2) 要學習好數據結構就要多多考慮如何將生活中遇到的問題,用程式去實現解決. 3) 程式 = 數據結構 + 演算法 20.2 數 ...
  • 一、前言 在概念上, click 把命令行分為 3 個組成:參數、選項和命令。 參數 就是跟在命令後的除選項外的內容,比如 git add a.txt 中的 a.txt 就是表示文件路徑的參數 選項 就是以 或 開頭的參數,比如 f、 file 命令 就是命令行的初衷了,比如 git 就是命令,而 ...
  • 本筆記摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/18/Thread.html,記錄一下學習過程以備後續查用。 一、線程的介紹 進程(Process)是應用程式的實例要使用的資源的一個集合,每個應用程式都在各自的進程中運行來確保應用程式不受其他 ...
  • using System.Reflection; static void ShowEnvironmentInfoDemo() { Type type = typeof(Environment); PropertyInfo[] pis = type.GetProperties(); if (pis !... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...