按钮点击事件没有在wpf中上升

时间:2015-07-21 11:22:35

标签: c# wpf events

我有一个wpf控件,其模板中包含许多控件。

我可以找到该模板中的一个元素并订阅它的点击事件,但它也不会触发点击事件。为什么呢?

c#c​​ode

var btn = element.FindChild<ToggleButton>("PART_ExpandToggleButton");
if (btn != null) btn .Click += Clicked;

private void Clicked(object sender, RoutedEventArgs e)
{
   //do some code
}

wpf代码

<ControlTemplate x:Key="MainDataTemplate">
    <Control Template="{DynamicResource ConnectorTemplate}" />
</ControlTemplate>

<ControlTemplate x:Key="ConnectorTemplate">
  <ToggleButton x:Name="PART_ExpandToggleButton" />
</ControlTemplate>

1 个答案:

答案 0 :(得分:0)

您确定在正确的地方这样做吗?每当我有一个需要访问其PARTS的控件时,我会在OnApplyTemplate中执行以下操作:

public override void OnApplyTemplate()
{
        base.OnApplyTemplate();
        VisualStateManager.GoToState(this, "Normal", false);

        //get the different parts
        clearFilterPart = this.GetTemplateChild("ClearFilterPart") as Button;
        distinctFilterPart = this.GetTemplateChild("DistinctFilterPart") as ToggleButton;
        ....
}

这是有效的代码。我在这里注意到我在一个特定的方法中进行了这个调用,我确信所讨论的控件是初始化的,并且我使用的方法与你进入该部分的方法不同。

使用调试器检查btn是否确实有值,或者因为它是基于字符串的任何部分。任何人都可以创建一个类型,所以我通常通过调试器来逐步验证这个代码。推迟这个,你将有一个很难找到的bug。如果btn为null,则单击按钮时不会引发事件处理程序。

上面示例附带的WPF控件的xaml如下:

<Style TargetType="{x:Type local:FilterTextBox}">
    <Setter Property="IsTabStop" Value="False"/>
    <Setter Property="Background" Value="White"/>
    <Setter Property="Focusable" Value="True"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:FilterTextBox}">
                 ...
                <Button x:Name="ClearFilterPart" />
                 ...   
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>