WPF自定义控件库

时间:2014-04-15 22:17:24

标签: c# .net wpf

我正在尝试构建一个包含按钮和文本的自定义控件。当我尝试编译时,我收到以下错误。

  

错误1“ResourceDictionary”根元素需要x:Class属性来支持XAML文件中的事件处理程序。删除Click事件的事件处理程序,或将x:Class属性添加到根元素。

我的代码:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:textbtn">
    <Style TargetType="{x:Type local:CustomControl1}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:CustomControl1}">
                    <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                        <Grid>
                            <TextBlock Text="This is a Test" Foreground="Aqua" Background="AntiqueWhite"/>
                            <Button Content="Button" Height="23" HorizontalAlignment="bottom" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
                        </Grid>
                    </Border>

                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

2 个答案:

答案 0 :(得分:3)

错误意味着它的内容。 click事件处理程序实际执行以下操作:

myButtonName.Click += myClass.ClickHandlerName;

如果您没有为资源词典分配一个类,那么它不知道将点击处理程序分配给哪些人!

因为控件模板不应紧密耦合到后面代码中的特定类,所以我会完全从模板中删除单击处理程序。无论如何,命令是MVVM中更好的选择。

答案 1 :(得分:2)

LordTakkera 很好地解释了这个错误,但是他不希望简单的解决方案被贴在他的答案上,所以,要明确这一点,提供一个类名到资源字典将允许您像在其他控件中一样使用事件处理程序:

<ResourceDictionary
    x:Class="ResourceDictionaryClass1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:textbtn">

但LordTakkera确实是对的:命令是实现ui回调的一种简洁方式。