WPF 簡易日期控制項 魔改ListBox

来源:https://www.cnblogs.com/T-ARF/archive/2020/05/10/12862586.html
-Advertisement-
Play Games

先上截圖 修正2 源代碼 修正: 應該將SetTime方法修改為,行號為207行開始修改 var nk = Day_of_week(year, month, 1); if (nk == 0) nk = 7; for (var i = 0; i < nk-1; i++) { Time.Add(new ...


先上截圖

修正2

源代碼

 

修正:

應該將SetTime方法修改為,行號為207行開始修改

     var nk = Day_of_week(year, month, 1);
            if (nk == 0)
                nk = 7;
            for (var i = 0; i < nk-1; i++)
            {
                Time.Add(new BaseTime());
            }

 

 

源代碼

整體過程是魔改Listbox,整體是放在用戶控制項中,關於日期的計算是來自這位博友的博文

抱歉沒有過多註釋,原本也只是一時興起,多多見諒

 

1 修改ListBox的模板

將listbox的模板設為一個三層結果的模板

1 左右日期調整

2 星期顯示

3 當月顯示

其中左右日期調整為按鈕,並實現是命令。星期顯示使用數據提供者進行枚舉綁定,當月顯示即為普通的lisbox面板

 

 

2修改ListItem

大部分的改動都是這裡的,一開始想用子項樣式選擇器或者子項模板選擇器來進行動態改變,不過發現不太適合,後來改為數據觸發器動態改變底層矩形顏色。

整體是一個checkbox,利用其屬性來完成選擇過程。

選擇過程是使用棧,保證只有最多兩個選擇項

 

 

3添加依賴屬性

保證某些數據能夠被獲取,不過沒有實現路由事件。所以本控制項依舊是一個玩具,不能被直接使用於真實項目

 

代碼中命名不太規範,請湊乎看。

XAML代碼

<UserControl x:Class="日期控制項.UC_DateTime"
             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" 
             xmlns:local="clr-namespace:日期控制項"
             xmlns:sys="clr-namespace:System;assembly=mscorlib"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800" x:Name="UC_DateTime_"    >
    <UserControl.Resources>
        <local:AutoWidth x:Key="AutoWidth"/>
        <ObjectDataProvider x:Key="Week" ObjectType="{x:Type sys:Enum}"  MethodName="GetValues"   >
            <ObjectDataProvider.MethodParameters>
                <x:Type  TypeName="local:BaseDateTime"/>
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
        <local:BaseDate x:Key="Time"   />
        <local:BaseSelectStyle x:Key="Select"/>
        <local:DateTimeCombo x:Key="DateTime"/>
        <local:SelectDateTimeList x:Key="SDT"/>
        <Style TargetType="local:UC_DateTime">
            <Setter Property="SelectDateTime"  Value="{Binding Source={StaticResource Time},  Path=SelectDateTimeList}"/>
        </Style>
    </UserControl.Resources>

    <Grid x:Name="GridPanel" Tag="{Binding ElementName=LB,Path=Tag}">
        <ListBox  Margin="0,0,0,10" x:Name="LB"    SelectionMode="Single"     BorderBrush="Silver" BorderThickness="0,1,0,1"  >
            <ListBox.ItemsSource>
                <MultiBinding  Converter="{StaticResource DateTime}">
                    <Binding ElementName="UC_DateTime_" Path="SetYear"/>
                    <Binding ElementName="UC_DateTime_" Path="SetMonth"/>
                    <Binding   Source="{StaticResource Time}"/>
                </MultiBinding>
            </ListBox.ItemsSource>
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel    Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorLevel=1,AncestorType=ScrollContentPresenter}, Path=ActualWidth}"   ItemWidth="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Width,Converter={StaticResource AutoWidth}}" />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
            <ListBox.Template>
                <ControlTemplate TargetType="ListBox">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="auto"/>
                            <RowDefinition Height="auto"/>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>
                        <Grid Grid.Row="0">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="*" />
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <Button x:Name="PreviousButton"   Grid.Column="0" Background="Transparent" Command="{Binding Path=PreviousClick,  Source={StaticResource Time}}"   BorderThickness="0" Content="&lt;" HorizontalContentAlignment="Left" >
                                <Button.CommandParameter>
                                    <MultiBinding Converter="{StaticResource DateTime}" ConverterParameter="1">
                                        <Binding ElementName="YEAR" Mode="TwoWay"/>
                                        <Binding ElementName="MONTH" Mode="TwoWay"/>
                                    </MultiBinding>
                                </Button.CommandParameter>
                            </Button>
                            <TextBlock Grid.Column="1" HorizontalAlignment="Center"  >
                                <Run x:Name="YEAR" Text="{Binding ElementName=UC_DateTime_,Path=SetYear}"/>
                                <Run Text="年"/>
                                <Run x:Name="MONTH" Text="{Binding ElementName=UC_DateTime_,Path=SetMonth}"/>
                                <Run Text="月"/>
                            </TextBlock>
                            <Button x:Name="NextButton" Grid.Column="2"  Command="{Binding Source={StaticResource Time}, Path=NextClick}"  Background="Transparent" BorderThickness="0" Content="&gt;" HorizontalContentAlignment="Right">
                                <Button.CommandParameter>
                                    <MultiBinding Converter="{StaticResource DateTime}" ConverterParameter="1">
                                        <Binding ElementName="YEAR" Mode="TwoWay"/>
                                        <Binding ElementName="MONTH" Mode="TwoWay"/>
                                    </MultiBinding>
                                </Button.CommandParameter>
                            </Button>
                        </Grid>
                        <ItemsControl   Grid.Row="1"    ItemsSource="{Binding Source={StaticResource Week}}" >
                            <ItemsControl.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <WrapPanel   Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorLevel=1,AncestorType=ItemsControl}, Path=ActualWidth}"   ItemWidth="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Width,Converter={StaticResource AutoWidth}}" />
                                </ItemsPanelTemplate>
                            </ItemsControl.ItemsPanel>
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding }" HorizontalAlignment="Center"/>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                        <Border Grid.Row="2" Margin="{TemplateBinding Margin}"   BorderThickness="{TemplateBinding BorderThickness}"  BorderBrush="{TemplateBinding BorderBrush}">
                            <ScrollViewer Padding="3" VerticalScrollBarVisibility="Hidden">
                                <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                            </ScrollViewer>
                        </Border>
                    </Grid>
                </ControlTemplate>
            </ListBox.Template>
            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="ListBoxItem">
                                <ControlTemplate.Resources>
                                    <SolidColorBrush Color="{Binding ElementName=UC_DateTime_, Path=SelectItemListBackGround}" x:Key="ListSelectedColor"/>
                                    <SolidColorBrush Color="{Binding ElementName=UC_DateTime_, Path=SelectItemBackGround}" x:Key="SelectedColor"/>
                                </ControlTemplate.Resources>
                                <CheckBox  x:Name="cb"  IsChecked="{Binding ItemIsSelected,Mode=TwoWay}"   ClickMode="Release" Command="{Binding  Click,Source={StaticResource Time }}"   CommandParameter="{ Binding RelativeSource={RelativeSource Mode=Self}, Path=DataContext}"  >
                                    <CheckBox.Template>
                                        <ControlTemplate>
                                            <Grid>
                                                <Grid>
                                                    <Grid.ColumnDefinitions>
                                                        <ColumnDefinition/>
                                                        <ColumnDefinition/>
                                                    </Grid.ColumnDefinitions>
                                                    <Rectangle Margin="0,2,0,2" Grid.Column="0" Fill="{Binding ElementName=UC_DateTime_, Path=SelectItemListBackGround }" x:Name="LeftBackGround"  Visibility="Collapsed"/>
                                                    <Rectangle Margin="0,2,0,2" Grid.Column="1" Fill="{Binding ElementName=UC_DateTime_, Path=SelectItemListBackGround }" x:Name="RightBackGround"  Visibility="Collapsed"/>
                                                    <Ellipse Grid.ColumnSpan="2" x:Name="bd" Width="{Binding ElementName=UC_DateTime_, Path=BackGroundEllipesSize}" Height="{Binding ElementName=UC_DateTime_, Path=BackGroundEllipesSize}"/>
                                                </Grid>
                                                <TextBlock   x:Name="txt"    Text="{Binding Time}" FontSize="{Binding ElementName=UC_DateTime_, Path=DateTimeFontSize}"  HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                            </Grid>
                                            <ControlTemplate.Triggers>
                                                <DataTrigger Binding="{Binding Time}" Value="0">
                                                    <Setter Property="IsEnabled" Value="False"/>
                                                    <Setter Property="Text" TargetName="txt" Value=""/>
                                                </DataTrigger>
                                                <MultiDataTrigger >
                                                    <MultiDataTrigger.Conditions>
                                                        <Condition Binding="{Binding ItemIsSelected}" Value="true"/>
                                                    </MultiDataTrigger.Conditions>
                                                    <Setter Property="Fill" TargetName="bd" Value="{Binding ElementName=UC_DateTime_, Path=SelectItemBackGround }" />
                                                </MultiDataTrigger>
                                                <DataTrigger Binding="{Binding ItemIsSelected}" Value="false">
                                                    <Setter Property="Fill" Value="White"   TargetName="bd"/>
                                                </DataTrigger>
                                                <DataTrigger Binding="{Binding BackGroundShowMode}" Value="None">
                                                    <Setter TargetName="LeftBackGround" Property="Visibility" Value="Collapsed"/>
                                                    <Setter TargetName="RightBackGround" Property="Visibility" Value="Collapsed"/>
                                                </DataTrigger>
                                                <DataTrigger Binding="{Binding BackGroundShowMode}" Value="Right">
                                                    <Setter TargetName="LeftBackGround" Property="Visibility" Value="Collapsed"/>
                                                    <Setter TargetName="RightBackGround" Property="Visibility" Value="Visible"/>
                                                </DataTrigger>
                                                <DataTrigger Binding="{Binding BackGroundShowMode}" Value="Left">
                                                    <Setter TargetName="LeftBackGround" Property="Visibility" Value="Visible"/>
                                                    <Setter TargetName="RightBackGround" Property="Visibility" Value="Collapsed"/>
                                                </DataTrigger>
                                                <DataTrigger Binding="{Binding BackGroundShowMode}" Value="Both">
                                                    <Setter TargetName="LeftBackGround" Property="Visibility" Value="Visible"/>
                                                    <Setter TargetName="RightBackGround" Property="Visibility" Value="Visible"/>
                                                    <Setter Property="Visibility" TargetName="bd"  Value="Hidden"/>
                                                </DataTrigger>
                                            </ControlTemplate.Triggers>
                                        </ControlTemplate>
                                    </CheckBox.Template>
                                </CheckBox>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ListBox.ItemContainerStyle>
        </ListBox>
    </Grid>
</UserControl>

 

XAML.CS頁面

using System;
using System.Collections.Generic;
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 日期控制項
{
    /// <summary>
    /// UC_DateTime.xaml 的交互邏輯
    /// </summary>
    public partial class UC_DateTime : UserControl
    {
        public UC_DateTime()
        {
            InitializeComponent();
        }
        public static readonly DependencyProperty DateTimeFontSizeProperty = DependencyProperty.Register("DateTimeFontSize", typeof(int), typeof(UC_DateTime), new PropertyMetadata(27));

        public int DateTimeFontSize
        {
            get => Convert.ToInt32(GetValue(DataContextProperty));
            set => SetValue(DataContextProperty, value);
        }

        public static readonly DependencyProperty BackGroundEllipesStretchProperty = DependencyProperty.Register("BackGroundEllipesStretch", typeof(Stretch), typeof(UC_DateTime), new PropertyMetadata(Stretch.UniformToFill));

        public Stretch BackGroundEllipesStretch
        {
            get => (Stretch)GetValue(BackGroundEllipesStretchProperty);
            set => SetValue(BackGroundEllipesStretchProperty, value);
        }

        public static readonly DependencyProperty SelectItemBackGroundProperty = DependencyProperty.Register("SelectItemBackGround", typeof(SolidColorBrush), typeof(UC_DateTime), new PropertyMetadata(new SolidColorBrush(Colors.Red)));

        public SolidColorBrush SelectItemBackGround
        {
            get => (SolidColorBrush)GetValue(SelectItemBackGroundProperty);
            set => SetValue(SelectItemBackGroundProperty, value);
        }

        public static readonly DependencyProperty BackGroundEllipesSizeProperty = DependencyProperty.Register("BackGroundEllipesSize", typeof(double), typeof(UC_DateTime), new PropertyMetadata(25.0));

        public double BackGroundEllipesSize
        {
            get => Convert.ToDouble(GetValue(BackGroundEllipesSizeProperty));
            set => SetValue(BackGroundEllipesSizeProperty, value);
        }

        public static readonly DependencyProperty SelectItemListBackGroundProperty = DependencyProperty.Register("SelectItemListBackGround", typeof(SolidColorBrush), typeof(UC_DateTime), new PropertyMetadata(new SolidColorBrush(Colors.Red)));
      
        public SolidColorBrush SelectItemListBackGround
        {
            get => (SolidColorBrush)GetValue(SelectItemListBackGroundProperty);
            set => SetValue(SelectItemListBackGroundProperty, value);
        }

        public static readonly DependencyProperty BackGroundShowModeProperty = DependencyProperty.Register("BackGroundShowMode", typeof(ShowMode), typeof(UC_DateTime), new PropertyMetadata(ShowMode.None));

        public ShowMode BackGroundShowMode
        {
            get => (ShowMode)GetValue(BackGroundShowModeProperty);
            set => SetValue(BackGroundShowModeProperty, value);
        }
        public static readonly DependencyProperty SetYearProperty = DependencyProperty.Register("SetYear", typeof(int), typeof(UC_DateTime), new PropertyMetadata(DateTime.Now.Year));

        public int SetYear
        {
            get => Convert.ToInt32(GetValue(SetYearProperty));
            set => SetValue(SetYearProperty, value);
        }
        public static readonly DependencyProperty SetMonthProperty = DependencyProperty.Register("SetMonth", typeof(int), typeof(UC_DateTime), new PropertyMetadata(DateTime.Now.Month));

        public int SetMonth
        {
            get => Convert.ToInt32(GetValue(SetMonthProperty));
            set => SetValue(SetMonthProperty, value);
        }
        //DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd"))
        public static readonly DependencyProperty SelectDateTimePropery = DependencyProperty.Register("SelectDateTime", typeof(List<DateTime>), typeof(UC_DateTime), new PropertyMetadata( new List<DateTime>() { }));

        public List<DateTime> SelectDateTime
        {
            get => (List<DateTime>)GetValue(SelectDateTimePropery);
            set => SetValue(SelectDateTimePropery, value);
        }
    }
}

 

 

最重要的視覺模型類

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;

namespace 日期控制項
{
    public class ClickCommand : ICommand
    {
        public event EventHandler CanExecuteChanged;

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public void Execute(object parameter)
        {
            if (parameter != null)
                Action?.Invoke(parameter);
            else
                NoParameterAction?.Invoke();
        }
        private Action NoParameterAction;
        private Action<object> Action;
        public ClickCommand(Action<object> acion)
        {
            this.Action = acion;
        }
        public ClickCommand(Action action)
        {
            this.NoParameterAction = action;
        }
    }
    public enum BaseDateTime
    {
        周一,
        周二,
        周三,
        周四,
        周五,
        周六,
        周日,
    }
    public enum ShowMode
    {
        Left,
        Right,
        Both,
        None
    }
    public class BaseTime : INotifyPropertyChanged
    {
        private int
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 Nacos最近項目一直在使用,其簡單靈活,支持更細粒度的命令空間,分組等為麻煩複雜的環境切換提供了方便;同時也很好支持動態路由的配置,只需要簡單的幾步即可。在國產的註冊中心、配置中心中比較突出,容易上手,本文通過gateway、nacos-consumer、nacos-provider三個簡單 ...
  • 1、JVM的位置:JVM是在操作系統上面的應用軟體 JVM虛擬機有三種如下: ① Sun公司的HotSpot; ② BEA公司的JRockit; ③ IBM公司的J9 JVM; java虛擬機屬於第一種: 2、JVM的體繫結構: 3、類載入器 作用:載入class文件 (類是模板,對象是具體的) 簡 ...
  • 視頻:https://www.bilibili.com/video/BV15x411x7WN?p=5 新建Devexpress Winform BlankApplication。 添加GridControl,Change View為LayoutView。 添加LayoutViewColumn,設置C ...
  • 一、在Jenkins中安裝Nunit插件進入jenkins的插件管理模塊,下載Nunit插件。此步驟不做截圖說明二、引用nunit.console的nuget包通過項目引用Nunit.console包 然後可以packages\NUnit.ConsoleRunner.3.11.1\tools文件夾查 ...
  • 一、發佈配置差異配置:編譯內容編譯目標NetWorkClient/KJ90NetClient.csproj編譯命令/t:build/p:Configuration=Release /p:OutputPath=../UploadRelease運行外部程式二、配置jenkins啟動外部程式不報錯通過參數... ...
  • 項目模板簡介 眾所周知,在我們使用VS新建項目時,都需要選擇一個項目模板,如下圖: 我們選擇完項目模板進行創建,創建完成之後,可以發現項目中已經包含了一些基礎的文件。例如MVC: 可以看到,MVC項目下,這麼多的文件、類都給我們自動生成了,我們並不需要敲任何代碼。 所以,項目模板,就是在我們創建新項 ...
  • 一.介紹ClosedXML.Report ClosedXML.Report開源報表 支持net4.0+。 github:https://github.com/ClosedXML/ClosedXML.Report github項目下載慢參考:https://blog.csdn.net/czjnoe/a ...
  • 第四講:https://www.bilibili.com/video/BV15x411x7WN?p=4 添加GridControl,一個GridControl可以對應多個展示數據View,預設會有一個GridView。設置ShowGroupPanel=false。 預設GridView,運行設計器。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...