只要在DataGridTextColumn裡面加入DataGridTextColumn.EditingElementStyle就可以在裡面放入事件了
方法如下
--> 
參考來源:Cell value changed event(?) in DataGrid
--> 
      
      ......  
        
          
           
      ......  
       
string dll = @"Z:\test.dll"; Assembly a = Assembly.UnsafeLoadFrom(dll);
string dll = @"Z:\test.dll"; ; byte[] assemblyBuffer = File.ReadAllBytes(dll); Assembly a = Assembly.Load(assemblyBuffer);
 
private void ServerBrowserItemsUI(ListserverList) { Application.Current.Dispatcher.BeginInvoke((Action)delegate () { serverList.ToList().ForEach(args => { OPCServerSource.Add(new Model.OPCServer() { ProgName = args.progID, ProgID = args.clsid.ToString(), Url = new System.Windows.Media.Imaging.BitmapImage(new Uri(@"/OPCDASettingWPFLib;component/Common/Images/lightIcon_green_20.png", UriKind.RelativeOrAbsolute)) }); }); }); } 
        public bool WriteAlarmEvent(IOPCDAClientLib.AlarmRecord alarm)
        {
            bool result = false;
            using (_cmd = new SqlCommand("AlarmRecordAdd", _connect))
            {
                _cmd.CommandType = System.Data.CommandType.StoredProcedure;
                _cmd.Parameters.Add("@TagName", System.Data.SqlDbType.NVarChar, 200);
                _cmd.Parameters.Add("@AlarmState", System.Data.SqlDbType.NVarChar, 100);
                _cmd.Parameters.Add("@Description", System.Data.SqlDbType.NVarChar);
                _cmd.Parameters.Add("@Value", System.Data.SqlDbType.NVarChar, 100);
                _cmd.Parameters.Add("@EventStampDate", System.Data.SqlDbType.Date);
                _cmd.Parameters.Add("@EventStampTime", System.Data.SqlDbType.Time);
                _cmd.Parameters.Add("@Provider", System.Data.SqlDbType.NVarChar, 100);
                _cmd.Parameters.Add("@Area", System.Data.SqlDbType.NVarChar, 100);
                _cmd.Parameters.Add("@Type", System.Data.SqlDbType.NVarChar, 100);
                _cmd.Parameters.Add("@Priority", System.Data.SqlDbType.Int,1);
                _cmd.Parameters.Add("@MilliSec", System.Data.SqlDbType.Int,1);
                _cmd.Parameters.Add("@Category", System.Data.SqlDbType.NVarChar, 100);
                _cmd.Parameters.Add("@CheckValue", System.Data.SqlDbType.NVarChar, 100);
                _cmd.Parameters.Add("@Operator", System.Data.SqlDbType.NVarChar, 100);
                _cmd.Parameters.Add("@DomainName", System.Data.SqlDbType.NVarChar, 100);
                _cmd.Parameters.Add("@UserFullName", System.Data.SqlDbType.NVarChar, 100);
                _cmd.Parameters.Add("@OperatorNode", System.Data.SqlDbType.NVarChar, 100);
                _cmd.Parameters.Add("@AlarmId", System.Data.SqlDbType.Int);
                _cmd.Parameters["@TagName"].Value = alarm.TagName ?? "";
                _cmd.Parameters["@AlarmState"].Value = alarm.AlarmState ?? "";
                _cmd.Parameters["@Description"].Value = alarm.Description ?? "";
                _cmd.Parameters["@Value"].Value = alarm.Value ?? "";
                _cmd.Parameters["@EventStampDate"].Value = DateTime.Now.ToString("yyyy/MM/dd");
                _cmd.Parameters["@EventStampTime"].Value = DateTime.Now.ToString("HH:mm:ss.fff");
                _cmd.Parameters["@Provider"].Value = alarm.Provider ?? "";
                _cmd.Parameters["@Area"].Value = alarm.Area ?? "";
                _cmd.Parameters["@Type"].Value = alarm.Type ?? "";
                _cmd.Parameters["@Priority"].Value = alarm.Priority;
                _cmd.Parameters["@MilliSec"].Value = 0;
                _cmd.Parameters["@Category"].Value = alarm.Category ?? "";
                _cmd.Parameters["@CheckValue"].Value = alarm.CheckValue;
                _cmd.Parameters["@Operator"].Value = alarm.Operator ?? "";
                _cmd.Parameters["@DomainName"].Value = alarm.DomainName ?? "";
                _cmd.Parameters["@UserFullName"].Value = alarm.UserFullName ?? "";
                _cmd.Parameters["@OperatorNode"].Value = alarm.OperatorNode ?? "";
                _cmd.Parameters["@AlarmId"].Value = alarm.AlarmId;
                _connect.Open();
                try
                {
                    if(ConnectStatus())
                    {
                        _cmd.ExecuteNonQuery();
                        _connect.Close();
                        result = true;
                    }
                    else
                    {
                        result = false;
                    }
                }
                catch(Exception ex)
                {
                    result = false;
                    throw ex;
                }
                finally
                {
                    _connect.Close();
                }
            }
            return result;
        }
ALTER PROCEDURE [dbo].[AlarmRecordAdd]
    @TagName nvarchar(200), @AlarmState nvarchar(100), @Description nvarchar(MAX),
    @Value nvarchar(100), @EventStampDate datetime, @EventStampTime datetime,
    @Provider nvarchar(100), @Area nvarchar(100), @Type nvarchar(100), @Priority int,
    @MilliSec int, @Category nvarchar(100), @CheckValue nvarchar(100), @Operator nvarchar(100),
    @DomainName nvarchar(100), @UserFullName nvarchar(100), @OperatorNode nvarchar(100),
    @AlarmId int
AS
 
DECLARE @EventTimeStamp datetime
DECLARE @EventDate char(10)
DECLARE @EventTime char(12)
 
BEGIN
    IF @EventStampDate IS NOT NULL AND @EventStampTime IS NOT NULL
    BEGIN
        SET @EventDate = CONVERT(varchar(10), @EventStampDate, 111)
        SET @EventTime = CONVERT(varchar(12), @EventStampTime, 114)
        SET @EventTimeStamp = CONVERT(datetime, @EventDate + ' ' + @EventTime, 121)
        SET @MilliSec = DATEPART(MS,@EventTimeStamp)
    END
    ELSE
    BEGIN
        SET @EventTimeStamp = '1900-01-01 07:07:07'
    END
    
    IF NOT EXISTS(SELECT TOP 1 EventStamp FROM AlarmRecord WHERE EventStamp = @EventTimeStamp AND TagName = @TagName AND AlarmState = @AlarmState )
    BEGIN
        INSERT INTO AlarmRecord(TagName, AlarmState, [Description], [Value], EventStamp,EventStampUTC, Provider, Area,
        [Type], Priority, MilliSec, Category, CheckValue, Operator, DomainName, UserFullName, OperatorNode,
        AlarmId, WriteTimestamp)
        VALUES(@TagName, @AlarmState, @Description, @Value, @EventTimeStamp,@EventTimeStamp, @Provider, @Area, @Type, @Priority,
        @MilliSec, @Category, @CheckValue, @Operator, @DomainName, @UserFullName, @OperatorNode, @AlarmId, GETDATE())
    END
    
    SELECT 0
END
using System;
using System.Collections.Generic;
using System.Text;
using System.Security;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace WS_Monitor_Task_CSharp
{
     /// 
     /// Class that allows running applications with full admin rights. In
     /// addition the application launched will bypass the Vista UAC prompt.
     ///  
    public  class ApplicationLoader
    {
        #region Structrures
        [StructLayout(LayoutKind.Sequential)]
        public struct SECURITY_ATTRIBUTES
        {
            public int Length;
            public IntPtr lpSecurityDescriptor;
            public bool bInheritHandle;
        }
        [StructLayout(LayoutKind.Sequential)]
        public struct STARTUPINFO
        { 
            public int cb;
            public String lpReserved;         
            public String lpDesktop;
            public String lpTitle;
            public uint dwX;        
            public uint dwY;
            public uint dwXSize;
            public uint dwYSize ;             
            public uint dwXCountChars;
            public uint dwYCountChars;
            public uint dwFillAttribute;             
            public uint dwFlags;
            public short wShowWindow;
            public short cbReserved2;              
            public IntPtr lpReserved2;
            public IntPtr hStdInput;
            public IntPtr hStdOutput;
            public IntPtr hStdError;
        
        }
         [StructLayout(LayoutKind.Sequential)]
          public struct PROCESS_INFORMATION
          {
              public IntPtr hProcess;
              public IntPtr hThread;
              public uint dwProcessId;
              public uint dwThreadId;
          }
          #endregion
        
          #region Enumberation
          enum TOKEN_TYPE : int
          {
              TokenPrimary = 1,
              TokenImpersonation = 2
          }
          enum SECURITY_IMPERSONATION_LEVEL : int
          {
              SecurityAnonymous = 0,
              SecurityIdentification = 1,
              SecurityImpersonation = 2,
              SecurityDelegation = 3,
          }
          #endregion
          #region Constants
          public const int TOKEN_DUPLICATE = 0x0002;
          public const uint MAXIMUM_ALLOWED = 0x2000000;
          public const int CREATE_NEW_CONSOLE = 0x00000010;
          public const int IDLE_PRIORITY_CLASS = 0x40;
          public const int NORMAL_PRIORITY_CLASS = 0x20;
          public const int HIGH_PRIORITY_CLASS = 0x80;
          public const int REALTIME_PRIORITY_CLASS = 0x100;
          #endregion
          #region Win32 API Imports
          [DllImport("kernel32.dll", SetLastError = true)]
          private static extern bool CloseHandle(IntPtr hSnapshot);
          [DllImport("kernel32.dll")]
          static extern uint WTSGetActiveConsoleSessionId();
          [DllImport("advapi32.dll", EntryPoint = "CreateProcessAsUser", SetLastError = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
          public extern static bool CreateProcessAsUser(IntPtr hToken, String lpApplicationName, String lpCommandLine, ref SECURITY_ATTRIBUTES lpProcessAttributes,
             ref SECURITY_ATTRIBUTES lpThreadAttributes, bool bInheritHandle, int dwCreationFlags, IntPtr lpEnvironment,
            String lpCurrentDirectory, ref STARTUPINFO lpStartupInfo, out PROCESS_INFORMATION lpProcessInformation);
          [DllImport("kernel32.dll")]
          static extern bool ProcessIdToSessionId(uint dwProcessId, ref uint pSessionId);
          [DllImport("advapi32.dll", EntryPoint = "DuplicateTokenEx")]
          public extern static bool DuplicateTokenEx(IntPtr ExistingTokenHandle, uint dwDesiredAccess,
              ref SECURITY_ATTRIBUTES lpThreadAttributes, int TokenType,
               int ImpersonationLevel, ref IntPtr DuplicateTokenHandle);
          [DllImport("kernel32.dll")]
          static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId);
          [DllImport("advapi32", SetLastError = true), SuppressUnmanagedCodeSecurityAttribute]
          static extern bool OpenProcessToken(IntPtr ProcessHandle, int DesiredAccess, ref IntPtr TokenHandle);
          #endregion
          /// 
          /// Launches the given application with full admin rights, and in addition bypasses the Vista UAC prompt
          ///  
          /// The name of the application to launch
          /// Process information regarding the launched application that gets returned to the caller
          /// 
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace WS_Monitor_Task_CSharp
{
    public class TSControl
    {
        /**/
        ///  
        /// Terminal Services API Functions,The WTSEnumerateSessions function retrieves a list of sessions on a specified terminal server, 
        ///   
        /// [in] Handle to a terminal server. Specify a handle opened by the WTSOpenServer function, or specify WTS_CURRENT_SERVER_HANDLE to indicate the terminal server on which your application is running 
        /// Reserved; must be zero 
        /// [in] Specifies the version of the enumeration request. Must be 1.  
        /// [out] Pointer to a variable that receives a pointer to an array of WTS_SESSION_INFO structures. Each structure in the array contains information about a session on the specified terminal server. To free the returned buffer, call the WTSFreeMemory function. 
        /// To be able to enumerate a session, you need to have the Query Information permission. 
        /// [out] Pointer to the variable that receives the number of WTS_SESSION_INFO structures returned in the ppSessionInfo buffer.  
        /// If the function succeeds, the return value is a nonzero value. If the function fails, the return value is zero  
        [DllImport("wtsapi32", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool WTSEnumerateSessions(int hServer, int Reserved, int Version, ref long ppSessionInfo, ref int pCount);
        /**/
        ///  
        /// Terminal Services API Functions,The WTSFreeMemory function frees memory allocated by a Terminal Services function. 
        ///   
        /// [in] Pointer to the memory to free 
        [DllImport("wtsapi32.dll")]
        public static extern void WTSFreeMemory(System.IntPtr pMemory);
        /**/
        ///  
        /// Terminal Services API Functions,The WTSLogoffSession function logs off a specified Terminal Services session. 
        ///   
        /// [in] Handle to a terminal server. Specify a handle opened by the WTSOpenServer function, or specify WTS_CURRENT_SERVER_HANDLE to indicate the terminal server on which your application is running.  
        /// [in] A Terminal Services session identifier. To indicate the current session, specify WTS_CURRENT_SESSION. You can use the WTSEnumerateSessions function to retrieve the identifiers of all sessions on a specified terminal server. 
        /// To be able to log off another user's session, you need to have the Reset permission  
        /// [in] Indicates whether the operation is synchronous. 
        /// If bWait is TRUE, the function returns when the session is logged off. 
        /// If bWait is FALSE, the function returns immediately. 
        /// If the function succeeds, the return value is a nonzero value. 
        /// If the function fails, the return value is zero.  
        [DllImport("wtsapi32.dll")]
        public static extern bool WTSLogoffSession(int hServer, long SessionId, bool bWait);
        [DllImport("Wtsapi32.dll")]
        public static extern bool WTSQuerySessionInformation(
            System.IntPtr hServer, 
            int sessionId, 
            WTSInfoClass wtsInfoClass,
            out StringBuilder ppBuffer, 
            out int pBytesReturned
            );
        public enum WTSInfoClass
        {
            WTSInitialProgram,
            WTSApplicationName,
            WTSWorkingDirectory,
            WTSOEMId,
            WTSSessionId,
            WTSUserName,
            WTSWinStationName,
            WTSDomainName,
            WTSConnectState,
            WTSClientBuildNumber,
            WTSClientName,
            WTSClientDirectory,
            WTSClientProductId,
            WTSClientHardwareId,
            WTSClientAddress,
            WTSClientDisplay,
            WTSClientProtocolType
        }
        /**/
        ///  
        /// The WTS_CONNECTSTATE_CLASS enumeration type contains INT values that indicate the connection state of a Terminal Services session. 
        ///   
        public enum WTS_CONNECTSTATE_CLASS
        {
            WTSActive,
            WTSConnected,
            WTSConnectQuery,
            WTSShadow,
            WTSDisconnected,
            WTSIdle,
            WTSListen,
            WTSReset,
            WTSDown,
            WTSInit,
        }
        /**/
        ///  
        /// The WTS_SESSION_INFO structure contains information about a client session on a terminal server. 
        /// if the WTS_SESSION_INFO.SessionID==0, it means that the SESSION is the local logon user's session. 
        ///   
        public struct WTS_SESSION_INFO
        {
            public int SessionID;
            [MarshalAs(UnmanagedType.LPTStr)]
            public string pWinStationName;
            public WTS_CONNECTSTATE_CLASS state;
        }
        /**/
        ///  
        /// The SessionEnumeration function retrieves a list of 
        ///WTS_SESSION_INFO on a current terminal server. 
        ///   
        /// a list of WTS_SESSION_INFO on a current terminal server  
        public static WTS_SESSION_INFO[] SessionEnumeration()
        {
            //Set handle of terminal server as the current terminal server 
            int hServer = 0;
            bool RetVal;
            long lpBuffer = 0;
            int Count = 0;
            long p;
            WTS_SESSION_INFO Session_Info = new WTS_SESSION_INFO();
            WTS_SESSION_INFO[] arrSessionInfo;
            RetVal = WTSEnumerateSessions(hServer, 0, 1, ref lpBuffer, ref Count);
            arrSessionInfo = new WTS_SESSION_INFO[0];
            if (RetVal)
            {
                arrSessionInfo = new WTS_SESSION_INFO[Count];
                int i;
                p = lpBuffer;
                for (i = 0; i < Count; i++)
                {
                    arrSessionInfo[i] =
                        (WTS_SESSION_INFO)Marshal.PtrToStructure(new IntPtr(p),
                        Session_Info.GetType());
                    p += Marshal.SizeOf(Session_Info.GetType());
                }
                WTSFreeMemory(new IntPtr(lpBuffer));
            }
            else
            {
                //Insert Error Reaction Here 
            }
            return arrSessionInfo;
        }
        public TSControl()
        {
            // 
            // TODO: 在此处添加构造函数逻辑 
            // 
        }
    }
}
if (sb.ToString().Trim() == "dmpadmin")
[DllImport("Wtsapi32.dll")]
private static extern bool WTSQuerySessionInformation(IntPtr hServer, int sessionId, WtsInfoClass wtsInfoClass, out IntPtr ppBuffer, out int pBytesReturned);
[DllImport("Wtsapi32.dll")]
private static extern void WTSFreeMemory(IntPtr pointer);
 
private enum WtsInfoClass
{
    WTSUserName = 5, 
    WTSDomainName = 7,
}
 
private static string GetUsername(int sessionId, bool prependDomain = true)
{
    IntPtr buffer;
    int strLen;
    string username = "SYSTEM";
    if (WTSQuerySessionInformation(IntPtr.Zero, sessionId, WtsInfoClass.WTSUserName, out buffer, out strLen) && strLen > 1)
    {
        username = Marshal.PtrToStringAnsi(buffer);
        WTSFreeMemory(buffer);
        if (prependDomain)
        {
            if (WTSQuerySessionInformation(IntPtr.Zero, sessionId, WtsInfoClass.WTSDomainName, out buffer, out strLen) && strLen > 1)
            {
                username = Marshal.PtrToStringAnsi(buffer) + "\\" + username;
                WTSFreeMemory(buffer);
            }
        }
    }
    return username;
}
 
using System;
namespace WindowsServiceTest
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Management.SelectQuery sQuery = new System.Management.SelectQuery(string.Format("select name, startname from Win32_Service")); // where name = '{0}'", "MCShield.exe"));
            using (System.Management.ManagementObjectSearcher mgmtSearcher  = new System.Management.ManagementObjectSearcher(sQuery))
            {
                foreach (System.Management.ManagementObject service in mgmtSearcher.Get())
                {
                    string servicelogondetails =
                        string.Format("Name: {0} ,  Logon : {1} ", service["Name"].ToString(), service["startname"]).ToString();
                    Console.WriteLine(servicelogondetails);
                }
            }
            Console.ReadLine();
        }
    }
}
MethodBase method = stackTrace.GetFrame(1).GetMethod(); string methodName = method.Name; string className = method.ReflectedType.Name; Console.WriteLine(className + "." + methodName);
DelayStartTimeTextBox.PreviewTextInput += StaticResourceModel.PreviewTextInput;
    public static class StaticResourceModel
    {
        public static void PreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            e.Handled = new System.Text.RegularExpressions.Regex("[^0-9]+").IsMatch(e.Text);
        }
    }
 
public ObservableCollectionMyString = new ObservableCollection (new List ()); 
public ICommand ResetProgramCommand { get { if (_resetProgramCommand == null) { _resetProgramCommand = new RelayCommand(obj => {_event.ResetProgramEvent() , _event.UpdateProgramEvent()}, null); } return _resetProgramCommand; } }
 
string value = string.empty;
string result = "Success";
public ICommand ResetProgramCommand { get { if (_resetProgramCommand == null) { _resetProgramCommand = new RelayCommand(obj => {_event.ResetProgramEvent(),value = result;}, null); } return _resetProgramCommand; } }
 
首先宣告XDocument的物件,並給它檔案路徑去讀取,然後再new一個ObservableCollection的string泛型,透過linq的語法去取得attribute的參數,並轉成list在轉型放入到ObservableCollection。
XDocument allLanguage = XDocument.Load($@"{Properties.Settings.Default.ConfigPath}");
name = = new ObservableCollection((from data in allLanguage.Descendants("TaskManager").Descendants("Language") select data).Elements("LanguageInfo").Select(args => args.Attribute("name").Value).ToList());
value = new ObservableCollection((from data in allLanguage.Descendants("TaskManager").Descendants("Language") select data).Elements("LanguageInfo").Select(args => args.Attribute("value").Value).ToList());
   
如果是要放到一個類別裡面也可以這樣宣告
foreach(XElement element in (from data in allLanguage.Descendants("TaskManager").Descendants("Language") select data).Elements("LanguageInfo"))
{
StaticResourceModel.ComboBoxValue.Add(new ComboBoxValue() {Name= element.Attribute("name").Value , Value = element.Attribute("value").Value});
}
 
 
 
 
 
 
  
 
 
 
  
  
 
  
 
 
 
 
 
public void Test(3). Func Func是有傳回值的泛型委派 Func(Action action,T p) { action(p); }