2012-09-18 60 views
2

我正在创建自定义UserControl,并希望UC可以像Button一样有Command。我是WPF的新手。WPF:用户控件的命令和CommandParameter

这是我到目前为止已经试过没有任何的运气:

WelcomeView.xaml

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="150"/> 
    </Grid.RowDefinitions> 

    <Controls:SignedButton Grid.Row="1" VerticalAlignment="Top" Width="245" Height="45" Foreground="#FFFFFF" 
          LeftSign="+" Text="Add an account" TextSize="20" 
          ButtonBackground="#3A5795" HoverBackground="#C41AD7" HoverOpacity="1" 
          Command="{x:Static Infrastructure:ApplicationCommands.NavigateCommand}" 
          CommandParameter="{x:Type Views:AddAccountView}"/> 
</Grid> 

SignedButton.xaml.cs

public partial class SignedButton : UserControl 
{ 

    public static DependencyProperty ButtonBackgroundProperty = 
     DependencyProperty.Register("ButtonBackground", typeof (string), typeof (SignedButton)); 

    public static DependencyProperty CommandParameterProperty = 
     DependencyProperty.Register("CommandParameter", typeof (object), typeof (SignedButton)); 

    public static DependencyProperty CommandProperty = 
     DependencyProperty.Register("Command", typeof (ICommand), typeof (SignedButton)); 

    public static DependencyProperty HoverBackgroundProperty = 
     DependencyProperty.Register("HoverBackground", typeof (string), typeof (SignedButton)); 

    public static DependencyProperty HoverOpacityProperty = 
     DependencyProperty.Register("HoverOpacity", typeof (double), typeof (SignedButton)); 

    public static DependencyProperty LeftSignProperty = 
     DependencyProperty.Register("LeftSign", typeof (string), typeof (SignedButton)); 

    public static DependencyProperty RightSignProperty = 
     DependencyProperty.Register("RightSign", typeof (string), typeof (SignedButton)); 

    public static DependencyProperty TextProperty = 
     DependencyProperty.Register("Text", typeof (string), typeof (SignedButton)); 

    public static DependencyProperty TextSizeProperty = 
     DependencyProperty.Register("TextSize", typeof (double), typeof (SignedButton)); 

    public SignedButton() 
    { 
     InitializeComponent(); 
    } 

    public string ButtonBackground 
    { 
     get { return (string) GetValue(ButtonBackgroundProperty); } 
     set { SetValue(ButtonBackgroundProperty, value); } 
    } 

    public ICommand Command 
    { 
     get { return (ICommand) GetValue(CommandProperty); } 
     set { SetValue(CommandProperty, value); } 
    } 

    public object CommandParameter 
    { 
     get { return GetValue(CommandParameterProperty); } 
     set { SetValue(CommandParameterProperty, value); } 
    } 

    public string HoverBackground 
    { 
     get { return (string) GetValue(HoverBackgroundProperty); } 
     set { SetValue(HoverBackgroundProperty, value); } 
    } 

    public double HoverOpacity 
    { 
     get { return (double) GetValue(HoverOpacityProperty); } 
     set { SetValue(HoverOpacityProperty, value); } 
    } 

    public string LeftSign 
    { 
     get { return (string) GetValue(LeftSignProperty); } 
     set { SetValue(LeftSignProperty, value); } 
    } 

    public string RightSign 
    { 
     get { return (string) GetValue(RightSignProperty); } 
     set { SetValue(RightSignProperty, value); } 
    } 

    public string Text 
    { 
     get { return (string) GetValue(TextProperty); } 
     set { SetValue(TextProperty, value); } 
    } 

    public double TextSize 
    { 
     get { return (double) GetValue(TextSizeProperty); } 
     set { SetValue(TextSizeProperty, value); } 
    } 
} 

SignedButton.xaml

<UserControl x:Class="Client.Infrastructure.Controls.SignedButton" 
      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" 
      d:DesignHeight="45" d:DesignWidth="245" 
      DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
    <UserControl.Resources> 
     <FontFamily x:Key="OpenSans">. . .</FontFamily> 
     <Storyboard x:Key="OnMouseEnter"> 
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="grid"> 
       . . . 
      </DoubleAnimationUsingKeyFrames> 
      <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="grid"> 
       . . . 
      </ColorAnimationUsingKeyFrames> 
     </Storyboard> 
     <Storyboard x:Key="OnMouseLeave"> 
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="grid"> 
       . . . 
      </DoubleAnimationUsingKeyFrames> 
      <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="grid"> 
       . . . 
      </ColorAnimationUsingKeyFrames> 
     </Storyboard> 
    </UserControl.Resources> 
    <UserControl.Triggers> 
     <EventTrigger RoutedEvent="Mouse.MouseEnter"> 
      . . . 
     </EventTrigger> 
     <EventTrigger RoutedEvent="Mouse.MouseLeave"> 
      . . . 
     </EventTrigger> 
    </UserControl.Triggers> 
    <Grid x:Name="grid" Cursor="Hand" Background="{Binding ButtonBackground}"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="50"/> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="50"/> 
     </Grid.ColumnDefinitions> 
     <TextBlock Text="{Binding LeftSign}" 
        FontFamily="{DynamicResource OpenSans}" FontSize="{Binding TextSize}" 
        HorizontalAlignment="Center" VerticalAlignment="Center"/> 
     <TextBlock Text="{Binding Text}" 
        FontFamily="{DynamicResource OpenSans}" FontSize="{Binding TextSize}" 
        HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="1"/> 
     <TextBlock Text="{Binding RightSign}" 
        FontFamily="{DynamicResource OpenSans}" FontSize="{Binding TextSize}" 
        HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="2"/> 
    </Grid> 
</UserControl> 

回答

5

它看起来像你剩下的一个步骤是将ICommand界面连接到控件的UI。首先创建一个鼠标单击事件监听器。

public SignedButton() 
{ 
    InitializeComponent(); 
    this.MouseUp += new MouseButtonEventHandler(MyClassContent_MouseUp); 
} 

void MyClassContent_MouseUp(object sender, MouseButtonEventArgs e) 
{ 
    Command.Execute(CommandParameter); 
} 

您也想听听关于Command实例CanExecuteChanged事件,启用/禁用的UI可点击指标。


脚注从问题的范围,它可能是可取的,而延长WPF Button控制不是重新创造它的各种功能。这是可能的customize its appearance and behavior in various ways,同时仍然使用核心功能,如Visual States(按下,激活,禁用等)和ICommand集成。