Avalonia 使用元件(UserControl) 子類別從父類別 繼承的只有非事件(event)相關,所有事件都要重新撰寫
Avalonia 使用元件(UserControl) 子類別從父類別 繼承的只有非事件(event)相關,所有事件都要重新撰寫
資料來源: 自己
父類別XMAL
<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="30" MinHeight="30"> <!-- 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" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="{Binding TextSize, ElementName=root}" 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>
父類別CODE
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<double> TextSizeProperty = AvaloniaProperty.Register<BaseButton, double>(nameof(TextSize)); 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 double TextSize { get => GetValue(TextSizeProperty); set => SetValue(TextSizeProperty, value); } 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> ExternalClicked; public BaseButton() { InitializeComponent(); // Attach the event handler for TextBlock's PointerPressed event Bd_Base.PointerPressed += OnClicked; } // Event handler method private void OnClicked(object sender, PointerPressedEventArgs e) { // Raise the external click event ExternalClicked?.Invoke(this, e); } }
子類別CODE
using Avalonia.Input; using Avalonia.Interactivity; using Avalonia.Media; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using VPOS; namespace VPOS_Avalonia { public class CustBtn : BaseButton { public int m_intSID; private bool m_blnAutoFontSize; public IBrush m_BackgroundColor00; public IBrush m_BackgroundColor01; public decimal m_intPrice; public String m_StrProductCode; public bool m_blnspec; public List<product_Var> m_product; public List<int> m_same_group_sid; public int m_min_count; public int m_max_count; public String m_Strproduct_type;//類型 public int m_inttax_sid; //稅率編號 ; 產品若沒有稅率資料[m_tax_sid=0],就直接從company和tax_data取出預設值 public int m_inttax_rate; //稅率 public String m_Strtax_type;//稅率類型 public int m_inttax_fee; //稅率金額 public void InitData(int intSID) { m_intSID = intSID; } public void InitDisplay(IBrush BorderColor, IBrush BackgroundColor00, IBrush BackgroundColor01, String Text, double FontSize, bool blnAutoFontSize = false, int intMinimumWidth = 0, int intMinimumHeight = 0) { this.MinWidth = (intMinimumWidth > 0) ? intMinimumWidth : this.MinWidth; this.MinHeight = (intMinimumHeight > 0) ? intMinimumHeight : this.MinHeight; this.BorderColor = BorderColor; this.BackgroundColor = (IsEnabled) ? BackgroundColor00 : Brush.Parse("#FFCCCCCC"); m_BackgroundColor00 = BackgroundColor00; m_BackgroundColor01 = BackgroundColor01; this.TextColor = (IsEnabled) ? Brushes.White : Brush.Parse("#FFA0A0A0"); if (FontSize > 0) { this.TextSize = FontSize; m_dblFontSize = FontSize; } this.Text = Text; m_blnAutoFontSize = blnAutoFontSize; } public void SetText(String Text) { this.Text = Text; if (Text.Length > 0) { m_blnChange = false; this.TextSize = m_dblFontSize; FontSizeChanged(); } } public String GetText() { this.IsVisible = true; return this.Text; } public void SetBackgroundColor(IBrush BackgroundColor) { this.BackgroundColor = BackgroundColor; } public void SetBackgroundColor(bool blnClick = false) { if (blnClick) { this.BackgroundColor = (IsEnabled) ? m_BackgroundColor01 : Brush.Parse("#FFCCCCCC"); this.TextColor = (IsEnabled) ? Brushes.White : Brush.Parse("#FFA0A0A0"); } else { this.BackgroundColor = (IsEnabled) ? m_BackgroundColor00 : Brush.Parse("#FFCCCCCC"); this.TextColor = (IsEnabled) ? Brushes.White : Brush.Parse("#FFA0A0A0"); } } // Declare the external click event public event EventHandler<RoutedEventArgs> ExternalClicked; public CustBtn() { InitializeComponent(); m_intSID = 0; m_blnAutoFontSize = false; this.MinWidth = 40; this.MinHeight = 45; m_dblContentWidth = 0.0f; m_dblContentHeight = 0.0f; m_dblFontSize = 0.0f; m_blnChange = false; this.LayoutUpdated += OnLayoutUpdated; // Attach the event handler for TextBlock's PointerPressed event Bd_Base.PointerPressed += OnClicked; } private void OnClicked(object sender, PointerPressedEventArgs e) { // Raise the external click event ExternalClicked?.Invoke(this, e); } private double m_dblBoundsWidth; private double m_dblBoundsHeight; private void OnLayoutUpdated(object sender, EventArgs e) { m_dblBoundsWidth = this.Bounds.Width; m_dblBoundsHeight = this.Bounds.Height; if(m_blnAutoFontSize) { SetText(Text); } } private double m_dblFontSize; private double m_dblContentWidth; private double m_dblContentHeight; private bool m_blnChange = false; private void FontSizeChanged() { /* 透過 按鈕大小變化事件 配合計算文字長度 進而縮小字型大小 使其文字不要被裁切 */ double w = 0.38;//字型1 -> 寬度 double h = 0.96;//字型1 -> 高度 //int intCount = 0; string strData = RemoveNewLines(this.Text).Replace("...", ""); int intLen = GetCustomLength(strData); m_dblContentWidth = m_dblBoundsWidth - 4;//無條件捨取(2 -> Padding 1) m_dblContentHeight = m_dblBoundsHeight - 4;//無條件捨取(2 -> Padding 1) if (!m_blnChange) { m_blnChange = true; double dblNewLineCount = 0; do { dblNewLineCount = Math.Ceiling((this.TextSize * intLen * 1.25 * w) / m_dblContentWidth); if ((dblNewLineCount * h * this.TextSize * 1.25) <= m_dblContentHeight) { break; } else { //intCount++; this.TextSize = this.TextSize - 0.3; } } while (true); /* //自動放大字體 if(intCount == 0) { double dblOriginalCount = dblNewLineCount; do { dblNewLineCount = Math.Ceiling((Content.FontSize * intLen * 1 * w) / m_dblContentWidth); if ( (dblNewLineCount == dblOriginalCount) && ((dblNewLineCount * h * Content.FontSize * 1) < m_dblContentHeight) ) { intCount++; Content.FontSize = Content.FontSize + 0.5; } else { break; } } while (true); } //*/ } } public string RemoveNewLines(string input, string strReplace = "")//自動剔除字串中的所有換行符號 { if (string.IsNullOrEmpty(input)) { return input; } // 使用正則表達式移除換行符號 return Regex.Replace(input, @"\r\n|\r|\n", strReplace); } private int GetCustomLength(string text)//計算字串長度 中文=3 { int length = 0; foreach (char c in text) { // 判斷字符是否為中文 if (c >= 0x4E00 && c <= 0x9FFF) { length += 3; // 中文字符算作3個英文字 } else { length += 1; // 其他字符算作一個英文字 } } return length; } } }