XAML - การจัดการเหตุการณ์

แนวคิดทั่วไปของเหตุการณ์ใน XAML คล้ายกับเหตุการณ์ในภาษาโปรแกรมยอดนิยมอื่น ๆ เช่น. NET และ C ++ ใน XAML การควบคุมทั้งหมดจะเปิดเผยเหตุการณ์บางอย่างเพื่อให้สามารถสมัครรับข้อมูลตามวัตถุประสงค์เฉพาะได้

เมื่อใดก็ตามที่เกิดเหตุการณ์ขึ้นแอปพลิเคชันจะได้รับการแจ้งเตือนและโปรแกรมสามารถตอบสนองต่อเหตุการณ์นั้นได้เช่นปุ่มปิดใช้เพื่อปิดกล่องโต้ตอบ

มีเหตุการณ์หลายประเภทที่สามารถสมัครได้สำหรับพฤติกรรมที่แตกต่างกันของแอปพลิเคชันตามข้อกำหนดของแอปพลิเคชันนั้น ๆ แต่เหตุการณ์ที่ใช้บ่อยที่สุดคือเหตุการณ์ที่เกี่ยวข้องกับเมาส์และคีย์บอร์ดเช่น

  • Click
  • MouseDown
  • MouseEnter
  • MouseLeave
  • MouseUp
  • KeyDown
  • KeyUp

ในบทนี้เราจะใช้เหตุการณ์พื้นฐานและใช้บ่อยที่สุดเพื่อทำความเข้าใจว่าเหตุการณ์ของการควบคุมที่เฉพาะเจาะจงสามารถเชื่อมโยงกับโค้ดที่อยู่เบื้องหลังการทำงานได้อย่างไรโดยขึ้นอยู่กับสิ่งที่ผู้ใช้ต้องการทำเมื่อเกิดเหตุการณ์เฉพาะ เกิดขึ้น

มาดูตัวอย่างง่ายๆของเหตุการณ์การคลิกปุ่ม ด้านล่างนี้คือการใช้งาน XAML สำหรับปุ่มควบคุมซึ่งสร้างและเริ่มต้นด้วยคุณสมบัติบางอย่างและเหตุการณ์คลิก (Click = "OnClick")

<Window x:Class = "XAMLEventHandling.MainWindow" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
   Title = "MainWindow" Height = "350" Width = "604"> 
	
   <Grid> 
      <Button x:Name = "button1" Content = "Click" Click = "OnClick" 
         Width = "150" Height = "30" HorizontalAlignment = "Center" /> 
   </Grid>
   
</Window>

เมื่อใดก็ตามที่คลิกปุ่มนี้ปุ่มนี้จะเริ่มการทำงาน OnClickและคุณสามารถเพิ่มพฤติกรรมประเภทใดก็ได้เพื่อตอบสนองต่อการคลิก มาดูการใช้งานเหตุการณ์ OnClick ซึ่งจะแสดงข้อความเมื่อคลิกปุ่มนี้

using System; 
using System.Windows; 
using System.Windows.Controls;  

namespace XAMLEventHandling {
   /// <summary> 
      /// Interaction logic for MainWindow.xaml 
   /// </summary> 
	
   public partial class MainWindow : Window {
      public MainWindow() { 
         InitializeComponent(); 
      }
      private void OnClick(object sender, RoutedEventArgs e) { 
         MessageBox.Show("Button is clicked!"); 
      } 
   }
}

เมื่อคุณคอมไพล์และรันโค้ดด้านบนโค้ดดังกล่าวจะให้ผลลัพธ์ดังต่อไปนี้ -

เมื่อคุณคลิกที่ปุ่มเหตุการณ์คลิก (OnClick) จะเริ่มทำงานและข้อความต่อไปนี้จะปรากฏขึ้น

ตอนนี้เรามาดูตัวอย่างที่ซับซ้อนเล็กน้อยซึ่งมีการจัดการหลายเหตุการณ์

ตัวอย่าง

ตัวอย่างต่อไปนี้มีกล่องข้อความที่มี ContextMenu ซึ่งจัดการกับข้อความภายในกล่องข้อความ

โค้ด XAML ต่อไปนี้จะสร้างกล่องข้อความ, ContextMenu และ MenuItems ที่มีคุณสมบัติและเหตุการณ์บางอย่างเช่น Checked, Unchecked และ Click

<Window x:Class = "XAMLContextMenu.MainWindow" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
   Title = "MainWindow" Height = "350" Width = "604"> 
	
   <Grid> 
      <TextBox Name = "textBox1" TextWrapping = "Wrap" Margin = "10" Grid.Row = "7"> 
         Hi, this is XAML tutorial. 
         <TextBox.ContextMenu>
         
            <ContextMenu>
               <MenuItem Header = "_Bold" IsCheckable = "True" 
                  Checked = "Bold_Checked" Unchecked = "Bold_Unchecked" /> 
               <MenuItem Header = "_Italic" IsCheckable = "True" 
                  Checked = "Italic_Checked" Unchecked = "Italic_Unchecked" /> 
               <Separator /> 
               <MenuItem Header = "Increase Font Size" Click = "IncreaseFont_Click" />
               <MenuItem Header = "_Decrease Font Size" Click = "DecreaseFont_Click" /> 
            </ContextMenu> 
				
         </TextBox.ContextMenu>
      </TextBox>
   </Grid> 
	
</Window>

นี่คือการนำไปใช้งานใน C # สำหรับเหตุการณ์ต่างๆซึ่งจะเริ่มทำงานเมื่อใดก็ตามที่มีการเลือกรายการเมนูไม่เลือกหรือคลิก

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data;  

namespace XAMLContextMenu { 
   /// <summary> 
      /// Interaction logic for MainWindow.xaml 
   /// </summary>
	
   public partial class MainWindow : Window {
      public MainWindow() { 
         InitializeComponent(); 
      }
      private void Bold_Checked(object sender, RoutedEventArgs e) { 
         textBox1.FontWeight = FontWeights.Bold; 
      }
      private void Bold_Unchecked(object sender, RoutedEventArgs e) { 
         textBox1.FontWeight = FontWeights.Normal; 
      }
      private void Italic_Checked(object sender, RoutedEventArgs e) { 
         textBox1.FontStyle = FontStyles.Italic; 
      }
      private void Italic_Unchecked(object sender, RoutedEventArgs e) { 
         textBox1.FontStyle = FontStyles.Normal; 
      }
      private void IncreaseFont_Click(object sender, RoutedEventArgs e) { 
         if (textBox1.FontSize < 18) { 
            textBox1.FontSize += 2; 
         } 
      }
      private void DecreaseFont_Click(object sender, RoutedEventArgs e) { 
         if (textBox1.FontSize > 10) { 
            textBox1.FontSize -= 2; 
         } 
      }
   }
}

เมื่อคุณคอมไพล์และรันโค้ดด้านบนโค้ดดังกล่าวจะให้ผลลัพธ์ดังต่อไปนี้ -

เราขอแนะนำให้คุณรันโค้ดตัวอย่างด้านบนและทดลองกับเหตุการณ์อื่น ๆ

เหตุการณ์

ซีเนียร์ การควบคุมและคำอธิบาย
1

Checked

เริ่มทำงานเมื่อมีการเลือก ToggleButton (รับมาจาก ToggleButton)

2

Click

เกิดขึ้นเมื่อคลิกปุ่มควบคุม (สืบทอดมาจาก ButtonBase)

3

ContextMenuClosing

เกิดขึ้นก่อนเมนูบริบทใด ๆ ในองค์ประกอบจะปิด (สืบทอดมาจาก FrameworkElement)

4

ContextMenuOpening

เกิดขึ้นเมื่อเมนูบริบทใด ๆ บนองค์ประกอบถูกเปิดขึ้น (สืบทอดมาจาก FrameworkElement)

5

DataContextChanged

เกิดขึ้นเมื่อค่าของคุณสมบัติ FrameworkElement.DataContext เปลี่ยนแปลง (สืบทอดจาก FrameworkElement)

6

DragEnter

เกิดขึ้นเมื่อระบบอินพุตรายงานเหตุการณ์ลากพื้นฐานโดยมีองค์ประกอบนี้เป็นเป้าหมาย (สืบทอดมาจาก UIElement)

7

DragLeave

เกิดขึ้นเมื่อระบบอินพุตรายงานเหตุการณ์ลากพื้นฐานที่มีองค์ประกอบนี้เป็นต้นกำเนิด (รับมาจาก UIElement)

8

DragOver

เกิดขึ้นเมื่อระบบอินพุตรายงานเหตุการณ์ลากที่อยู่ภายใต้องค์ประกอบนี้เป็นเป้าหมายการดร็อปที่เป็นไปได้ (รับมาจาก UIElement)

9

DragStarting

เกิดขึ้นเมื่อเริ่มดำเนินการลาก (รับมาจาก UIElement)

10

DropCompleted

เกิดขึ้นเมื่อการดำเนินการลากและวางสิ้นสุดลง (รับมาจาก UIElement)

11

DropDownClosed

เกิดขึ้นเมื่อส่วนแบบเลื่อนลงของ ComboBox ปิดลง

12

DropDownOpened

เกิดขึ้นเมื่อส่วนแบบเลื่อนลงของ ComboBox เปิดขึ้น

13

GotFocus

เกิดขึ้นเมื่อ UIElement ได้รับโฟกัส (รับมาจาก UIElement)

14

Holding

เกิดขึ้นเมื่อการโต้ตอบ Hold ที่ไม่ได้จัดการเกิดขึ้นในพื้นที่ทดสอบ Hit ขององค์ประกอบนี้ (รับมาจาก UIElement)

15

Intermediate

จะเริ่มทำงานเมื่อสถานะของ ToggleButton ถูกเปลี่ยนเป็นสถานะไม่แน่นอน (รับมาจาก ToggleButton)

16

IsEnabledChanged

เกิดขึ้นเมื่อคุณสมบัติ IsEnabled เปลี่ยนแปลง (สืบทอดมาจากการควบคุม)

17

KeyDown

เกิดขึ้นเมื่อกดแป้นคีย์บอร์ดในขณะที่ UIElement มีโฟกัส (รับมาจาก UIElement)

18

KeyUp

เกิดขึ้นเมื่อปล่อยปุ่มคีย์บอร์ดในขณะที่ UIElement มีโฟกัส (รับมาจาก UIElement)

19

LostFocus

เกิดขึ้นเมื่อ UIElement สูญเสียโฟกัส (รับมาจาก UIElement)

20

ManipulationCompleted

เกิดขึ้นเมื่อการจัดการบน UIElement เสร็จสมบูรณ์ (รับมาจาก UIElement)

21

ManipulationDelta

เกิดขึ้นเมื่ออุปกรณ์อินพุตเปลี่ยนตำแหน่งระหว่างการปรับแต่ง (รับมาจาก UIElement)

22

ManipulationInertiaStarting

เกิดขึ้นเมื่ออุปกรณ์อินพุตสูญเสียการติดต่อกับออบเจ็กต์ UIElement ระหว่างการปรับแต่งและความเฉื่อยเริ่มต้นขึ้น (รับมาจาก UIElement)

23

ManipulationStarted

เกิดขึ้นเมื่ออุปกรณ์อินพุตเริ่มการจัดการกับ UIElement (รับมาจาก UIElement)

24

ManipulationStarting

เกิดขึ้นเมื่อตัวประมวลผลการจัดการถูกสร้างขึ้นครั้งแรก (รับมาจาก UIElement)

25

SelectionChanged

เกิดขึ้นเมื่อการเลือกข้อความมีการเปลี่ยนแปลง

26

SizeChanged

เกิดขึ้นเมื่อคุณสมบัติ ActualHeight หรือ ActualWidth เปลี่ยนค่าบน FrameworkElement (สืบทอดจาก FrameworkElement)

27

Unchecked

เกิดขึ้นเมื่อไม่ได้เลือก ToggleButton (รับมาจาก ToggleButton)

28

ValueChanged

เกิดขึ้นเมื่อค่าช่วงเปลี่ยนไป (รับมาจาก RangeBase)