首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用wpf开发自定义控件 包含下拉列表和表格及分页

下面将为你详细介绍如何使用 WPF 开发一个包含下拉列表、表格及分页的自定义控件。### 1. 创建 WPF 项目首先,打开 Visual Studio,创建一个新的 WPF 应用程序项目。### 2. 设计自定义控件的 XAML 部分(`CustomControl.xaml`)```xml<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"                    xmlns:local="clr-namespace:YourNamespace">    <Style TargetType="{x:Type local:CustomControl}">        <Setter Property="Template">            <Setter.Value>                <ControlTemplate TargetType="{x:Type local:CustomControl}">                    <Grid>                        <Grid.RowDefinitions>                            <RowDefinition Height="Auto"/>                            <RowDefinition Height="*"/>                            <RowDefinition Height="Auto"/>                        </Grid.RowDefinitions>                        <!-- 下拉列表 -->                        <ComboBox x:Name="PART_ComboBox"                                  HorizontalAlignment="Left"                                  Margin="10"                                  VerticalAlignment="Top"                                  Width="150"                                  ItemsSource="{Binding ComboBoxItems, RelativeSource={RelativeSource TemplatedParent}}"                                  SelectedItem="{Binding SelectedComboBoxItem, RelativeSource={RelativeSource TemplatedParent}}"/>                        <!-- 表格 -->                        <DataGrid x:Name="PART_DataGrid"                                  Grid.Row="1"                                  Margin="10"                                  ItemsSource="{Binding TableItems, RelativeSource={RelativeSource TemplatedParent}}"                                  AutoGenerateColumns="False">                            <!-- 这里可以根据需要添加具体的列 -->                            <DataGrid.Columns>                                <DataGridTextColumn Header="Column 1" Binding="{Binding Property1}"/>                                <DataGridTextColumn Header="Column 2" Binding="{Binding Property2}"/>                            </DataGrid.Columns>                        </DataGrid>                        <!-- 分页控件 -->                        <StackPanel Grid.Row="2"                                    Orientation="Horizontal"                                    HorizontalAlignment="Center"                                    Margin="10">                            <Button Content="Previous"                                    Click="{Binding PreviousPageCommand, RelativeSource={RelativeSource TemplatedParent}}"/>                            <TextBlock Text="{Binding CurrentPage, RelativeSource={RelativeSource TemplatedParent}}"                                       Margin="10"/>                            <TextBlock Text="of" Margin="10"/>                            <TextBlock Text="{Binding TotalPages, RelativeSource={RelativeSource TemplatedParent}}"                                       Margin="10"/>                            <Button Content="Next"                                    Click="{Binding NextPageCommand, RelativeSource={RelativeSource TemplatedParent}}"/>                        </StackPanel>                    </Grid>                </ControlTemplate>            </Setter.Value>        </Setter>    </Style></ResourceDictionary>```### 3. 实现自定义控件的 C# 逻辑部分(`CustomControl.cs`)```csharpusing System;using System.Collections.Generic;using System.Collections.ObjectModel;using System.Windows;using System.Windows.Controls;using System.Windows.Input;namespace YourNamespace{    public class CustomControl : Control    {        static CustomControl()        {            DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl), new FrameworkPropertyMetadata(typeof(CustomControl)));        }        // 下拉列表项        public static readonly DependencyProperty ComboBoxItemsProperty =            DependencyProperty.Register("ComboBoxItems", typeof(ObservableCollection<string>), typeof(CustomControl), new PropertyMetadata(new ObservableCollection<string>()));        public ObservableCollection<string> ComboBoxItems        {            get { return (ObservableCollection<string>)GetValue(ComboBoxItemsProperty); }            set { SetValue(ComboBoxItemsProperty, value); }        }        // 选中的下拉列表项        public static readonly DependencyProperty SelectedComboBoxItemProperty =            DependencyProperty.Register("SelectedComboBoxItem", typeof(string), typeof(CustomControl), new PropertyMetadata(null));        public string SelectedComboBoxItem        {            get { return (string)GetValue(SelectedComboBoxItemProperty); }            set { SetValue(SelectedComboBoxItemProperty, value); }        }        // 表格项        public static readonly DependencyProperty TableItemsProperty =            DependencyProperty.Register("TableItems", typeof(ObservableCollection<YourDataModel>), typeof(CustomControl), new PropertyMetadata(new ObservableCollection<YourDataModel>()));        public ObservableCollection<YourDataModel> TableItems        {            get { return (ObservableCollection<YourDataModel>)GetValue(TableItemsProperty); }            set { SetValue(TableItemsProperty, value); }        }        // 当前页码        public static readonly DependencyProperty CurrentPageProperty =            DependencyProperty.Register("CurrentPage", typeof(int), typeof(CustomControl), new PropertyMetadata(1));        public int CurrentPage        {            get { return (int)GetValue(CurrentPageProperty); }            set { SetValue(CurrentPageProperty, value); }        }        // 总页数        public static readonly DependencyProperty TotalPagesProperty =            DependencyProperty.Register("TotalPages", typeof(int), typeof(CustomControl), new PropertyMetadata(1));        public int TotalPages        {            get { return (int)GetValue(TotalPagesProperty); }            set { SetValue(TotalPagesProperty, value); }        }        // 上一页命令        public ICommand PreviousPageCommand { get; private set; }        // 下一页命令        public ICommand NextPageCommand { get; private set; }        public CustomControl()        {            PreviousPageCommand = new RelayCommand(PreviousPage);            NextPageCommand = new RelayCommand(NextPage);        }        private void PreviousPage()        {            if (CurrentPage > 1)            {                CurrentPage--;                // 这里可以添加切换页码时更新表格数据的逻辑            }        }        private void NextPage()        {            if (CurrentPage < TotalPages)            {                CurrentPage++;                // 这里可以添加切换页码时更新表格数据的逻辑            }        }    }    public class RelayCommand : ICommand    {        private readonly Action _execute;        private readonly Func<bool> _canExecute;        public RelayCommand(Action execute) : this(execute, null) { }        public RelayCommand(Action execute, Func<bool> canExecute)        {            _execute = execute;            _canExecute = canExecute;        }        public bool CanExecute(object parameter)        {            return _canExecute == null || _canExecute();        }        public event EventHandler CanExecuteChanged        {            add { CommandManager.RequerySuggested += value; }            remove { CommandManager.RequerySuggested -= value; }        }        public void Execute(object parameter)        {            _execute();        }    }    public class YourDataModel    {        public string Property1 { get; set; }        public string Property2 { get; set; }    }}```### 4. 在主窗口中使用自定义控件(`MainWindow.xaml`)```xml<Window x:Class="YourNamespace.MainWindow"        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        xmlns:local="clr-namespace:YourNamespace"        Title="MainWindow" Height="450" Width="800">    <Grid>        <local:CustomControl>            <local:CustomControl.ComboBoxItems>                <sys:String>Item 1</sys:String>                <sys:String>Item 2</sys:String>                <sys:String>Item 3</sys:String>            </local:CustomControl.ComboBoxItems>            <local:CustomControl.TableItems>                <local:YourDataModel Property1="Value 1" Property2="Value 2"/>                <local:YourDataModel Property1="Value 3" Property2="Value 4"/>            </local:CustomControl.TableItems>            <local:CustomControl.TotalPages>                5            </local:CustomControl.TotalPages>        </local:CustomControl>    </Grid></Window>```### 代码解释- **`CustomControl.xaml`**:定义了自定义控件的外观布局,包含一个下拉列表、一个表格和一个分页控件。通过 `ControlTemplate` 来组织这些元素,并使用数据绑定将属性和命令绑定到 `CustomControl.cs` 中的相应属性和方法。- **`CustomControl.cs`**:    - 使用 `DependencyProperty` 定义了多个属性,包括下拉列表项、选中的下拉列表项、表格项、当前页码和总页数等。    - 实现了 `PreviousPageCommand` 和 `NextPageCommand` 两个命令,分别用于处理上一页和下一页的点击事件。    - `RelayCommand` 类是一个简单的命令实现,用于将命令绑定到具体的方法。- **`MainWindow.xaml`**:在主窗口中使用自定义控件,并为其属性赋值,展示了如何使用这个自定义控件。通过以上步骤,你就可以开发出一个包含下拉列表、表格及分页的自定义控件。你可以根据实际需求进一步扩展和修改这个控件。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O3HVDAkcr3Q46S6w_UFaThmw0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券