Avalonia(C#) 元件開發[元件(UserControl)滑鼠事件(Event handler)指定/綁定~ 滑鼠點擊(PointerPressed event)]
Avalonia(C#) 元件開發[元件(UserControl)滑鼠事件(Event handler)指定/綁定~ 滑鼠點擊(PointerPressed event)]
資料來源: copilot
開發一個自訂義的按鈕並載自訂對話和使用 具有:自訂屬性/子元件疊加/繪圖
BaseButton.axaml
<UserControl xmlns="https://github.com/avaloniaui" 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" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Name="root" x:Class="VPOS_Avalonia.BaseButton" MinWidth="100" MinHeight="50"> <!-- Grid 疊加圖層準備 --> <Grid RowDefinitions="*" ColumnDefinitions="*"> <!-- Border 圓弧邊框--> <Border Name="Bd_Base" Grid.Row="0" CornerRadius="5" BorderBrush="{Binding BorderColor, ElementName=root}" BorderThickness="1" Background="{Binding BackgroundColor, ElementName=root}" > <Grid RowDefinitions="*" ColumnDefinitions="*"> <TextBlock Name="TB_Base" TextWrapping="WrapWithOverflow" FontSize="24" HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding Text, ElementName=root}" Background="{Binding BackgroundColor, ElementName=root}" Foreground="{Binding TextColor, ElementName=root}"/> <Canvas> <!-- Drawing area <Rectangle Fill="Blue" Width="10" Height="10" Stroke="Red" StrokeThickness="2"/> --> </Canvas> </Grid> </Border> </Grid> </UserControl>
BaseButton.cs
using Avalonia; using Avalonia.Controls; using Avalonia.Input; using Avalonia.Interactivity; using Avalonia.Media; using System; using static System.Net.Mime.MediaTypeNames; namespace VPOS_Avalonia; public partial class BaseButton : UserControl { // 可以在此添加額外的屬性、事件或方法 public static readonly StyledProperty<string> TextProperty = AvaloniaProperty.Register<BaseButton, string>(nameof(Text)); public static readonly StyledProperty<IBrush> TextColorProperty = AvaloniaProperty.Register<BaseButton, IBrush>(nameof(TextColor)); public static readonly StyledProperty<IBrush> BackgroundColorProperty = AvaloniaProperty.Register<BaseButton, IBrush>(nameof(BackgroundColor)); public static readonly StyledProperty<IBrush> BorderColorProperty = AvaloniaProperty.Register<BaseButton, IBrush>(nameof(BorderColor)); public string Text { get => GetValue(TextProperty); set => SetValue(TextProperty, value); } public IBrush BackgroundColor { get => GetValue(BackgroundColorProperty); set => SetValue(BackgroundColorProperty, value); } public IBrush TextColor { get => GetValue(TextColorProperty); set => SetValue(TextColorProperty, value); } public IBrush BorderColor { get => GetValue(BorderColorProperty); set => SetValue(BorderColorProperty, value); } // Declare the external click event public event EventHandler<RoutedEventArgs> ExternalClick; public BaseButton() { InitializeComponent(); // Attach the event handler for TextBlock's PointerPressed event Bd_Base.PointerPressed += OnClick; } // Event handler method private void OnClick(object sender, PointerPressedEventArgs e) { // Raise the external click event ExternalClick?.Invoke(this, e); } }
MessageBox.axaml
<Window xmlns="https://github.com/avaloniaui" 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" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" xmlns:local="clr-namespace:VPOS_Avalonia" x:Class="VPOS_Avalonia.MessageBox" Title="MessageBox"> <Grid RowDefinitions="*,3*" ColumnDefinitions="*" > <TextBlock Text="VTEAM MSG" Grid.Row="0" Foreground="Blue" FontSize="32" HorizontalAlignment="Center" VerticalAlignment="Center" /> <Border Grid.Row="1" BorderBrush="White" BorderThickness="2"> <Grid RowDefinitions="2*,*" ColumnDefinitions="2.5*,2*,2.5*" > <TextBlock x:Name="Msg" TextWrapping="Wrap" Grid.Row="0" Foreground="White" Grid.ColumnSpan="5" FontSize="28" HorizontalAlignment="Center" VerticalAlignment="Center"/> <local:BaseButton x:Name="Close" Grid.Row="1" Grid.Column="1" Text="確定" TextColor="White" BackgroundColor="#ff00a1e0" BorderColor="White" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="30,5,30,5" /> </Grid> </Border> </Grid> </Window>
MessageBox.cs
using Avalonia; using Avalonia.Controls; using Avalonia.Input; using Avalonia.Interactivity; using Avalonia.Markup.Xaml; using Avalonia.Media; using Avalonia.Platform; using Avalonia.Styling; using System; namespace VPOS_Avalonia; public partial class MessageBox : Window { public MessageBox(String StrMsg) { //隱藏工具列 this.ExtendClientAreaToDecorationsHint = true; this.ExtendClientAreaTitleBarHeightHint = -1; this.SystemDecorations = SystemDecorations.None; //---隱藏工具列 WindowStartupLocation = WindowStartupLocation.CenterScreen;//視窗置中 this.Background = new SolidColorBrush(Color.Parse("#ff194a6e"));//設定背景色 this.BorderBrush = Brushes.Blue;//設定藍色邊框 this.BorderThickness = new Thickness(2);//設定邊框寬度 InitializeComponent(); //--- //視窗尺寸 Width = 600; Height = 300; //---視窗尺寸 Msg.Text = StrMsg;//指定訊息 //Close.BorderColor = new SolidColorBrush(Color.Parse("#FF0000")); Close.ExternalClick += Close_Click; } private void Close_Click(object sender, RoutedEventArgs e) { /* //--- //自訂元件內子元件屬性變更方法 var userControl = (BaseButton)sender; var textBlock = userControl.FindControl<TextBlock>("TB_Base"); textBlock.Text = "Clicked from outside!"; //---自訂元件內子元件屬性變更方法 */ this.Close(); } }