如何在ControlTemplate中绑定事件的wpf

时间:2017-03-12 05:22:20

标签: wpf

代码背后:

 public class LoginButton : Button
    {
        public static DependencyProperty LoginedProperty;
        public static DependencyProperty LoginEventProperty;
        public delegate void LoginEventDelegate(object sender, RoutedEventArgs e);
        static LoginButton()
        {
            LoginedProperty = DependencyProperty.Register("Logined", typeof(Boolean), typeof(LoginButton));
            LoginEventProperty = DependencyProperty.Register("LoginEvent", typeof(LoginEventDelegate), typeof(LoginButton));
        }

        public Boolean Logined
        {
            get { return (Boolean)base.GetValue(LoginedProperty); }
            set { base.SetValue(LoginedProperty, value); }
        }

        public event LoginEventDelegate LoginEvent;
        protected virtual void OnLoginEvent(object sender, RoutedEventArgs e)
        {
            if (LoginEvent != null)
                LoginEvent(sender,e);
        }
    }

XAML:

<ControlTemplate x:Key="LoginButtonTemplate" TargetType="local:LoginButton">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="auto"></ColumnDefinition>
                        <ColumnDefinition Width="*"></ColumnDefinition>
                    </Grid.ColumnDefinitions>
                    <ContentPresenter VerticalAlignment="Center" Margin="10,0,0,0"></ContentPresenter>
                    <Grid Grid.Column="1" Margin="5,0,0,0">
                        <Label Name="L" VerticalAlignment="Center" Padding="0" Foreground="#919191" Visibility="Collapsed">logined</Label>
                        <Button Name="B" Template="{StaticResource CustomButton}" Background="Transparent" BorderThickness="0" Padding="0" Foreground="#3598db" Content="click login"></Button>
                    </Grid>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="Logined" Value="true">
                        <Setter TargetName="L" Property="Visibility" Value="Visible"></Setter>
                        <Setter TargetName="B" Property="Visibility" Value="Collapsed"></Setter>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>

--------------------------------
我想实现这个功能:
Name =&#34; B&#34;在ControlTemplate中,当我单击它时,它可以处理自定义事件OnLoginEvent?
我该怎么办? --------------------------------
哦,似乎没有人知道我的英语不好的意思 现在我更详细地解释一下这个功能 软件需要管理大约100个或更多帐户,如果帐户未登录,它将显示按钮让用户登录。如果登录,它将显示登录的标签
所以我创建了一个名为LoginButton的新的自定义用户控件,并创建了一个布尔值&#39; Logined&#39;如果登录则控制按钮 不同帐户的Beaucase具有不同的登录功能。所以我创建了一个新的事件&#39; LoginEvent&#39;应用不同的登录功能。现在的问题是按钮Name =&#34; B&#34;要登录。我需要绑定按钮Name =&#34; B&#34;点击活动或预览活动事件&#39; LoginEvent&#39;。但是我找不到绑定它的方法。
请帮助我,非常感谢。

1 个答案:

答案 0 :(得分:0)

您可以覆盖OnApplyTemplate类的LoginButton方法,并将事件处理程序连接到引发事件的模板中“B”按钮的click事件。

LoginEvent应该是一个事件而不是依赖属性。

试试这个:

public class LoginButton : Button
{
    public static DependencyProperty LoginedProperty;
    public delegate void LoginEventDelegate(object sender, RoutedEventArgs e);

    static LoginButton()
    {
        LoginedProperty = DependencyProperty.Register("Logined", typeof(Boolean), typeof(LoginButton));
    }

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        Button b = this.Template.FindName("B", this) as Button;
        if(b != null)
        {
            b.Click += (s, e) => OnLoginEvent(s, e);
        }
    }

    public Boolean Logined
    {
        get { return (Boolean)base.GetValue(LoginedProperty); }
        set { base.SetValue(LoginedProperty, value); }
    }

    public event LoginEventDelegate LoginEvent;
    protected virtual void OnLoginEvent(object sender, RoutedEventArgs e)
    {
        if (LoginEvent != null)
            LoginEvent(sender, e);
    }
}

<强>用法:

<local:LoginButton Template="{StaticResource LoginButtonTemplate}" LoginEvent="LoginButton_LoginEvent"/>
private void LoginButton_LoginEvent(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Login!");
}