从Generic.xaml中点击按钮?

3

我正在编写一个Silverlight自定义控件,但是我遇到了一个问题:无法通过Button点击访问Generic.xaml文件。以下代码没有实现这个功能:

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:ScrollableTabControl">
                    <Button Grid.Row="0" Grid.Column="0" x:Name="ScrollLeft" Click="scrollLeft">&lt;</Button>
            </ControlTemplate>
        </Setter.Value>

“ScrollLeft”在我的C#文件中。

然而,这也不起作用:

        var b = this.GetTemplateChild("ScrollLeft");
        Debug.Assert(b != null);

无论我做什么,b都会返回null。我感觉应该有一种简单的方法来将点击方法分配给这个按钮,那么我错在哪里了?

编辑:这是我的C#文件中的方法:

    public void scrollLeft(object sender, RoutedEventArgs e)
    {
        //var scroller = Application.Current.Resources["TabScroller"] as ScrollViewer;
        //scroller.LineLeft();
    }

你的点击事件处理程序的代码(包括方法名)在哪里? - taylonr
我已经编辑过了,现在它有这个了。 - TheEnigmaMachine
2个回答

2

你需要在自定义控件类(C#文件)中覆盖 OnApplyTemplate() 方法。

像这样:

    public override void OnApplyTemplate()
    {
        Button btn = GetTemplateChild("ScrollLeft") as Button;
        Debug.Assert(btn != null);
    }

此外,您还需要在Generic.Xaml的控制模板中进行另一个更改,如下所示。
<Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustomControl1}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <Button Grid.Row="0" Grid.Column="0" x:Name="ScrollLeft">&lt;</Button>
                </Border>
            </ControlTemplate>
        </Setter.Value>

注意:我删除了点击事件处理程序。


请注意,设计师现在需要向任何自定义模板添加名为ScrollLeft的Button控件。Debug.Assert用于类的调试版本非常好,但在发布代码时无法解决此问题。因此,可能需要进行检查“if(btn != null){...}”。 - Emond
@Emo,是的,你说得对。在生产代码中,需要进行检查。如果设计师错过了控件,那么很可能会出现NullReference异常。 - Karthik Mahalingam

1

虽然有可能,但我建议使用命令,这样替换模板的设计师就可以自由选择其他控件和事件来绑定逻辑。


您是指将"Click="scrollLeft"更改为Command="scrollLeft"吗?因为这两者仍然会返回相同的错误。"从调用COM组件返回了HRESULT E_FAIL". - TheEnigmaMachine
啊,现在我明白你的问题了。你不能像那样分配点击(或任何其他事件)。重写OnApplyTemplate并搜索控件,然后附加处理程序或命令。http://www.silverlightshow.net/items/Creating-a-Silverlight-Custom-Control-The-Basics.aspx - Emond
谢谢!我现在明白你的意思了。 - TheEnigmaMachine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接