我有一个wpf控件,其模板中包含许多控件。
我可以找到该模板中的一个元素并订阅它的点击事件,但它也不会触发点击事件。为什么呢?
c#code
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>
答案 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>