您好,登錄后才能下訂單哦!
今天小編給大家分享一下WPF自定義控件如何實現(xiàn)的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
方式一:基于現(xiàn)有控件進行擴展,如基于button進行擴展,UI可直接用xmal進行編輯設計,邏輯用xaml.cs進行編輯
方法二:直接創(chuàng)建wpf自定義控件
本文用方法二開展自定義控件?。。?/p>
1.自定義控件的內容在代碼cs文件中,自定義控件繼承自Control,ui界面可在Genric.xaml中定義。
2.在Generic.xaml中定義控件界面
<Style TargetType="{x:Type ctrl:DevButton}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ctrl:DevButton}"> <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="0.1*" MaxWidth="5"/> <ColumnDefinition/> </Grid.ColumnDefinitions> //自定義控件中的組成 ,需要定義x:name,后臺代碼需要用到,button中的DevName是后臺cs中定義的依賴屬性 <Rectangle Margin="1" x:Name="statusLed"/> <Button Grid.Column="1" x:Name="devBtn" Content="{TemplateBinding DevName}"/> </Grid> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style>
上述界面中定義了兩個控件,組成本自定義控件的外觀顯示。一個rectangle,用顏色對狀態(tài)進行顯示,一個button,是本自定義控件的主要內容,需要顯示設備名稱,Click事件/Command需要觸發(fā)任務。
3.后臺處理
3.1 定義自定義屬性DevName
public string DevName { get { return (string)GetValue(DevNameProperty); } set { SetValue(DevNameProperty, value); } } public static readonly DependencyProperty DevNameProperty = DependencyProperty.Register("DevName", typeof(string), typeof(DevButton), new FrameworkPropertyMetadata("", new PropertyChangedCallback(OnDevNameChanged))); private static void OnDevNameChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { DevButton ctrl =sender as DevButton; ctrl.DevName = e.NewValue.ToString(); }
3.2 定義與前端界面UI元素對應的信息
private Rectangle statusLed; private Button devBtn; public override void OnApplyTemplate() { //備用方法 Template.FindName(DownButtonKey, this) as Button; statusLed = GetTemplateChild("statusLed") as Rectangle; devBtn = GetTemplateChild("devBtn") as Button; devBtn.Click += DevBtn_Click; base.OnApplyTemplate(); }
依據控件名稱查找模板中的控件,并注冊button的click事件
3.3 定義事件
private void DevBtn_Click(object sender, RoutedEventArgs e) { MessageBox.Show(DevName); }
自定義控件主要就是上述幾步。總體代碼如下:
using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfApp2 { /// <summary> /// Author:yut 2022-12-21 /// Function:自定義控件,用于設備的啟??刂?,同時顯示設備的運行狀態(tài) /// <summary> public class DevButton : Control { public DevButton() { SetCurrentValue(WidthProperty, 100d); SetCurrentValue(HeightProperty, 25d); SetCurrentValue(BackgroundProperty, Brushes.Yellow); } static DevButton() { DefaultStyleKeyProperty.OverrideMetadata(typeof(DevButton), new FrameworkPropertyMetadata(typeof(DevButton))); } private Rectangle statusLed; private Button devBtn; public override void OnApplyTemplate() { statusLed = GetTemplateChild("statusLed") as Rectangle; devBtn = GetTemplateChild("devBtn") as Button; devBtn.Click += DevBtn_Click; base.OnApplyTemplate(); } #region 自定義屬性 public int DevId { get { return (int)GetValue(DevIdProperty); } set { SetValue(DevIdProperty, value); } } public static readonly DependencyProperty DevIdProperty = DependencyProperty.Register("DevId", typeof(int), typeof(DevButton), new FrameworkPropertyMetadata(-1,new PropertyChangedCallback(OnDevIdChanged))); private static void OnDevIdChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { DevButton ctrl = (DevButton)sender; ctrl.DevId = (int)e.NewValue; } public string DevName { get { return (string)GetValue(DevNameProperty); } set { SetValue(DevNameProperty, value); } } public static readonly DependencyProperty DevNameProperty = DependencyProperty.Register("DevName", typeof(string), typeof(DevButton), new FrameworkPropertyMetadata("", new PropertyChangedCallback(OnDevNameChanged))); private static void OnDevNameChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { DevButton ctrl =sender as DevButton; ctrl.DevName = e.NewValue.ToString(); } public int DevStatus { get { return (int)GetValue(DevStatusProperty); } set { SetValue(DevStatusProperty, value); } } public static readonly DependencyProperty DevStatusProperty = DependencyProperty.Register("DevStatus", typeof(int), typeof(DevButton), new FrameworkPropertyMetadata(-1,new PropertyChangedCallback(OnDevStatusChanged))); private static void OnDevStatusChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { DevButton ctrl = (DevButton)sender; ctrl.DevStatus = (int)e.NewValue; ctrl.StatusBrush=(ctrl.DevStatus>0)?Brushes.Green:Brushes.LightGray; } public Brush StatusBrush { get { return (Brush)GetValue(StatusBrushProperty); } set { SetValue(StatusBrushProperty, value); } } public static readonly DependencyProperty StatusBrushProperty = DependencyProperty.Register("StatusBrush", typeof(Brush), typeof(DevButton), new FrameworkPropertyMetadata(Brushes.LightGray)); #endregion private void DevBtn_Click(object sender, RoutedEventArgs e) { MessageBox.Show(DevName); } } }
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:ctrl="clr-namespace:WpfApp2"> <Style TargetType="{x:Type ctrl:DevButton}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ctrl:DevButton}"> <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="0.1*" MaxWidth="5"/> <ColumnDefinition/> </Grid.ColumnDefinitions> <!--Fill="{TemplateBinding DevStatus, Converter={StaticResource IntToBrushes}}"--> <Rectangle Margin="1" x:Name="statusLed" Fill="{TemplateBinding StatusBrush}"/> <Button Grid.Column="1" x:Name="devBtn" Content="{TemplateBinding DevName}"/> </Grid> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style> </ResourceDictionary>
<Window x:Class="WpfApp2.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:WpfApp2" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid> <StackPanel> <TextBlock Text="******************"/> <local:DevButton DevName="電機" DevStatus="2"/> <TextBlock Text="******************"/> </StackPanel> </Grid> </Window>
運行效果如下:
以上就是“WPF自定義控件如何實現(xiàn)”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。