为自定义控件添加功能

时间:2015-11-09 02:24:02

标签: c# wpf

我需要一些关于如何向我的自定义控件添加功能的建议,它只是一个文本框和2个按钮,它们增加和减少它的值,这将是数字。

我不明白是为此功能添加代码的最佳方法。我应该在我的自定义控制代码后面使用命令吗?这是我目前的代码:

XAML - Generic.xaml

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Controls">

    <Style TargetType="{x:Type local:NumericUpDown}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:NumericUpDown}">
                    <Grid HorizontalAlignment="Center" Margin="5">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition />
                            <ColumnDefinition />
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>

                        <Button Grid.Column="0" 
                                Padding="5"
                                Background="Gray"
                                Command="{Binding Source=NumBox, Path=Increase}">
                            <Button.Content>
                                <Path Data="M0,0 L1,0 0.5,1Z" 
                                      Width="6" 
                                      Height="6" 
                                      Fill="White"
                                      Stretch="Fill"/>
                            </Button.Content>
                        </Button>
                        <TextBox x:Name="NumBox" 
                                 Grid.Column="1" 
                                 Text="0" 
                                 Padding="2" />
                        <Button Grid.Column="2" 
                                Padding="5"
                                Background="Gray">
                            <Button.Content>
                                <Path Data="M0,1 L1,1 0.5,0Z" 
                                      Width="6" 
                                      Height="6" 
                                      Fill="White" 
                                      Stretch="Fill" />
                            </Button.Content>
                        </Button>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

NumericUpDown.cs

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace Controls
{
    public class NumericUpDown : Control
    {
        static NumericUpDown()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(NumericUpDown), 
                new FrameworkPropertyMetadata(typeof(NumericUpDown)));
        }
    }
    public static class Command
    {
        public static readonly RoutedUICommand Increase = new RoutedUICommand("Increase the number", "IncreaseCommand", typeof(Command));
    }

    public class IncreaseCommand : ICommand
    {
        public bool CanExecute(object parameter)
        {
            return false;
        }
        public event EventHandler CanExecuteChanged;

        public void Execute(object parameter)
        {
            MessageBox.Show("click!");
        }
    }
}

显然我还没有让命令工作,我决定在继续之前征求意见。

2 个答案:

答案 0 :(得分:1)

当用户点击按钮时,它取决于您想要做什么。 如果功能只是增加和减少文本框中的值。你可以在后面的代码上注册命令点击事件(这是你的逻辑,你不想添加更多的动态逻辑)。

如果您还想让用户在点击按钮时添加自定义功能,您还可以 添加命令

答案 1 :(得分:1)

主要是在遇到CustomControls时,你会覆盖这样的OnApplyTemplate()方法。 (记住命名按钮)

public class NumericUpDown : Control
{
    static NumericUpDown()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(NumericUpDown), 
            new FrameworkPropertyMetadata(typeof(NumericUpDown)));
    }

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        Button increaseButton = this.GetTemplateChild("increaseButton") as Button;
        if (increaseButton != null)
        {
            increaseButton.Click += increaseButton_Click;
        }
    }

    private void increaseButton_Click(object sender, RoutedEventArgs e)
    {
        // Do what you want to do.
    }
}