zoukankan      html  css  js  c++  java
  • wpf企业应用之SelectButton(用于列表页之类的选择)

      在企业级应用中,通常我们会遇到这样的需求,需要点击一个按钮选择列表中的一项或者多项,然后将结果显示到按钮中。这里我给自己的控件命名为SelectButton,具体效果见 wpf企业级开发中的几种常见业务场景

      我的SelectButton是个用户控件,里面包含一个Button和一个TextBox,Button用于触发事件,TextBox用来显示选择后的结果。另外控件中添加了两个依赖项属性SelectedItem和DisplayProperty用来绑定选择后的结果,然后在TextBox中显示。下面是实现代码,希望能对读者有一定启发作用。

    <UserControl x:Class="Fuss.Wpf.Controls.SelectButton"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 mc:Ignorable="d">
        <DockPanel Name="selector_Panel" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
            <Button Name="selector_Button" DockPanel.Dock="Right" VerticalAlignment="Stretch" IsEnabled="{Binding IsEnabled, ElementName=selector_Panel}">
                <Button.Style>
                    <Style TargetType="Button">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate>
                                    <Border x:Name="button_Border" Background="{StaticResource Common_GradientBackgroundColor}" BorderBrush="{StaticResource Common_SolidBordColor}" BorderThickness="1">
                                        <StackPanel Orientation="Horizontal">
                                            <Ellipse Width="4" Height="4" Margin="1" Fill="Blue" VerticalAlignment="Center"/>
                                            <Ellipse Width="4" Height="4" Margin="1" Fill="Blue" VerticalAlignment="Center"/>
                                            <Ellipse Width="4" Height="4" Margin="1" Fill="Blue" VerticalAlignment="Center"/>
                                        </StackPanel>
                                    </Border>
                                    <ControlTemplate.Triggers>
                                        <Trigger Property="Button.IsMouseOver" Value="True">
                                            <Setter TargetName="button_Border" Property="Background" Value="{StaticResource Common_MouseMove_GradientBackgroundColor}"/>
                                            <Setter TargetName="button_Border" Property="BorderBrush"  Value="{StaticResource Common_MouseMove_SolidBordColor}"/>
                                        </Trigger>
                                        <Trigger Property="Button.IsPressed"  Value="True">
                                            <Setter TargetName="button_Border" Property="Background" Value="{StaticResource Common_MouseDown_RadialGradientBackgroundColor}"/>
                                            <Setter TargetName="button_Border" Property="BorderBrush"  Value="{StaticResource Common_MouseDown_SolidBordColor}"/>
                                        </Trigger>
                                        <Trigger Property="Button.IsEnabled"  Value="False">
                                            <Setter TargetName="button_Border" Property="Background" Value="{StaticResource Common_DisabledSolidBackgroundColor}"/>
                                        </Trigger>
                                    </ControlTemplate.Triggers>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </Button.Style>
            </Button>
            <TextBox Name="selector_TextBox" Margin="0" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" IsReadOnly="True" IsEnabled="{Binding IsEnabled, ElementName=selector_Panel}"/>        
        </DockPanel>
    </UserControl>
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    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 Fuss.Wpf.Controls
    {
        public partial class SelectButton : UserControl
        {
            public SelectButton()
            {
                InitializeComponent();
                this.Loaded += SelectButton_Loaded;
            }
    
            public Object SelectedItem
            {
                get
                {
                    return (Object)GetValue(SelectedItemProperty);
                }
                set
                {
                    SetValue(SelectedItemProperty, value);
                    if (value != null)
                    {
                        var pro = value.GetType().GetProperty(DisplayProperty);
                        if (pro != null && pro.GetValue(value) != null)
                            selector_TextBox.Text = pro.GetValue(value).ToString();
                        else
                            selector_TextBox.Text = "";
                    }
                }
            }
    
            public static readonly DependencyProperty SelectedItemProperty =
                DependencyProperty.Register("SelectedItem", typeof(Object), typeof(SelectButton),
                new FrameworkPropertyMetadata(String.Empty, new PropertyChangedCallback(OnSelectedItemChanged))
                {
                    BindsTwoWayByDefault = true
                });
    
            private static void OnSelectedItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                var selectButton = d as SelectButton;
                selectButton.SelectedItem = e.NewValue;
            }
    
            public String DisplayProperty
            {
                get
                {
                    return (String)GetValue(DisplayPropertyProperty);
                }
                set
                {
                    SetValue(DisplayPropertyProperty, value);
                }
            }
            public static readonly DependencyProperty DisplayPropertyProperty =
                DependencyProperty.Register("DisplayProperty", typeof(String), typeof(SelectButton), new PropertyMetadata(""));
    
            public event EventHandler Click;
    
            void SelectButton_Loaded(object sender, RoutedEventArgs e)
            {
                selector_Button.Click += selector_Button_Click;
            }
    
            void selector_Button_Click(object sender, RoutedEventArgs e)
            {
                if (this.Click != null)
                    Click(this, EventArgs.Empty);
            }
    
        }
    }

      用法如下

    <customer:SelectButton x:Name="SelectButton_ProductPlan" SelectedItem="{Binding ProductPlan}" DisplayProperty="Num" Click="SelectButton_ProductPlan_Click" Margin="5" Grid.Row="3" Grid.Column="1"/>
    private void SelectButton_ProductPlan_Click(object sender, EventArgs e)
    {
       ProductPlanSelectionWindow win = new ProductPlanSelectionWindow(VM.StockProduct);
       win.Owner = Window.GetWindow(this);
       win.SelectComplete += (s1, e1) =>
       {
          VM.ProductPlan = s1 as tb_productplan;
       };
       win.ShowDialog();
    }
  • 相关阅读:
    文件传输-一个大文件传输
    日志模块-logging模块
    加密模块hashlib
    面向对象进阶-反射
    面向对象
    模块和包
    作业-学生管理系统
    Java 链表反转
    Haoop MapReduce 的Partition和reduce端的二次排序
    Hadoop 笔记1 (原理和HDFS分布式搭建)
  • 原文地址:https://www.cnblogs.com/Fuss/p/4095585.html
Copyright © 2011-2022 走看看