自定义控件.DateTimePicker_02

ZC:踩坑过程在 后面

1、在 Generic.xaml 中添加内容

<ResourceDictionary
    x:Class="WpfCustomControlLibrary_DateTimePicker.Themes.Generic"  <!--ZC: 如果有事件触发的话,需要加这一句-->
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfCustomControlLibrary_DateTimePicker">
    <Style TargetType="{x:Type local:DateTimePickerZ}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:DateTimePickerZ}">
                    <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">



                        <!-- ZC: 这里面的部分是 自己添加的,外层的是 原来的 -->
                        <!-- ZC: Calendar 貌似要到 .net4.0才有 ? -->
                        <StackPanel>
                            <Calendar x:Name="calendar1" HorizontalAlignment="Left" VerticalAlignment="Top" BorderThickness="1" BorderBrush="Black"/>
                            <Border x:Name="border1" HorizontalAlignment="Left" VerticalAlignment="Top" BorderThickness="1" BorderBrush="Black" Background="Transparent" Margin="0,-3,0,0" >
                                <StackPanel Orientation="Horizontal">
                                    <StackPanel Orientation="Horizontal">
                                        <TextBox Text="{Binding Hour, Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent},UpdateSourceTrigger=PropertyChanged}" 
                                                 MinWidth="20" MaxLength="2" InputMethod.IsInputMethodEnabled="False" VerticalAlignment="Center" Background="Transparent"
                                                 TextWrapping="NoWrap" FontSize="12" VerticalContentAlignment="Center" HorizontalContentAlignment="Right" BorderBrush="Transparent" />
                                        <Label VerticalAlignment="Center" Content=":" FontSize="12" />
                                        <TextBox Text="{Binding Minute, Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent},UpdateSourceTrigger=PropertyChanged}" 
                                                 MinWidth="20" MaxLength="2" InputMethod.IsInputMethodEnabled="False" VerticalAlignment="Center" Background="Transparent"
                                                 TextWrapping="NoWrap" FontSize="12" VerticalContentAlignment="Center" HorizontalContentAlignment="Right" BorderBrush="Transparent"/>
                                        <Label VerticalAlignment="Center" Content=":" FontSize="12" />
                                        <TextBox Text="{Binding Second, Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent},UpdateSourceTrigger=PropertyChanged}" 
                                                 MinWidth="20" MaxLength="2" InputMethod.IsInputMethodEnabled="False" VerticalAlignment="Center" Background="Transparent"
                                                 TextWrapping="NoWrap" FontSize="12" VerticalContentAlignment="Center" HorizontalContentAlignment="Right" BorderBrush="Transparent"/>
                                    </StackPanel>


                                    <Grid VerticalAlignment="Stretch">
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="50*"></RowDefinition>
                                            <RowDefinition Height="50*"></RowDefinition>
                                        </Grid.RowDefinitions>
                                        <Button Grid.Row="0"  VerticalAlignment="Stretch" Width="30" x:Name="btnUp">
                                            <Path HorizontalAlignment="Center" VerticalAlignment="Center" Data="M 0 8 L 5 0 L 10 8 Z">
                                                <Path.Fill>
                                                    <SolidColorBrush Color="Black" />
                                                </Path.Fill>
                                            </Path>
                                        </Button>
                                        <Button Grid.Row="1" VerticalAlignment="Stretch" Width="30" Click="Click_Down">
                                            <Path HorizontalAlignment="Center" VerticalAlignment="Center" Data="M 0 0 L 5 8 L 10 0 Z" Margin="0,1,0,0">
                                                <Path.Fill>
                                                    <SolidColorBrush Color="Black" />
                                                </Path.Fill>
                                            </Path>
                                        </Button>
                                    </Grid>

                                    <Button  Margin="0,0,0,0" VerticalAlignment="Stretch" Width="36" BorderBrush="Black">
                                        <Path HorizontalAlignment="Center" VerticalAlignment="Center" Data="M 0 8 L 5 0 L 10 8" Margin="2,4,0,0" Stroke="Black" StrokeThickness="4" />
                                    </Button>
                                </StackPanel>
                            </Border>
                        </StackPanel>
                        
                        
                        
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

 

2、在 Themes文件夹中添加 类Generic.xaml.cs  (创建的 Generic.xaml.cs 和 Generic.xaml 的路径关系如下面的图中显示的那样)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;

namespace WpfCustomControlLibrary_DateTimePicker.Themes
{
    partial class Generic// ZC: 与Generic.xaml关联的话,需要加上关键字"partial"
    {
        void Click_Down(object sender, RoutedEventArgs e)
        {
            Console.WriteLine("Click_Down(...)");
            MessageBox.Show("Click_Down(...)");
        }

    }// class
    
}

 2.1、

  

 

  2.2、

  

 

3、ZC:之前 不知道 怎么在Generic.xaml里面弄 类似 按钮事件的代码。查到说,添加类 写事件代码,然后要在 Generic.xaml中的ResourceDictionary节点添加 "x:Class"属性,老是提示 错误(忘了具体是什么了...),然后还 又添加了 一个别的什么属性,但是 还是出错,搞不定。搜来搜去也找不到太多关于这个的知识点...

 3.1、找到了这一篇文章:ControlTemplate的ResourceDictionary中的WPF事件 - 代码日志.html(https://codeday.me/bug/20180705/189758.html

ResourceDictionary可以像Windows等一样在后面的代码,所以你可以添加一个事件处理程序,并从那里调用DragMove
设置后面的代码需要几个步骤。

>如果您的ResourceDictionary被称为MetroStyleResourceDictionary.xaml,则可以在Visual Studio中的同一文件夹中添加一个名为MetroStyleResourceDictionary.xaml.cs的新文件
>文件后面的代码应该是这样的
public partial class MetroStyleResourceDictionary
{
    //...
}
>之后,您需要将x:Class属性添加到Xaml文件
<ResourceDictionary x:Class="YourNamespace.MetroStyleResourceDictionary"
                    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <!--...-->
</ResourceDictionary>
现在,您可以为MouseLeftButtonDown的dragRectangle添加一个事件处理程序。您还需要抓住“窗口”,使其成为一个很好的主意
<Rectangle Name="dragRectangle"
           MouseLeftButtonDown="dragRectangle_MouseLeftButtonDown"
           Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
           .../>
最后,您可以将事件处理程序添加到文件后面的代码中,如下所示
public partial class MetroStyleResourceDictionary
{
    void dragRectangle_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        Rectangle dragRectangle = sender as Rectangle;
        Window window = dragRectangle.Tag as Window;
        if (window != null)
        {
            window.DragMove();
        }
    }
}

   ZC:终于知道 自己之前为什么失败了... 原来 创建的类的 类文件名 需要与 xaml文件有对应关系,如我的 xaml文件名为"Generic.xaml"  则创建的 类的文件名就应该是"Generic.xaml.cs",然后再在 "x:Class"中 指明对应的类

4、

5、

 

posted @ 2019-09-25 21:26  csskill  阅读(260)  评论(0编辑  收藏  举报