带有自定义控件的简单WPF事件问题

时间:2009-10-04 23:14:52

标签: c# wpf events

我正在创建一个名为“ShardButton”的自定义按钮,它使用Style来控制其内容及其事件触发器:

<Style x:Key="ButtonStyle" TargetType="{x:Type obj:ShardButton}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type obj:ShardButton}">
                <Grid>
                    <Path .../>
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                      VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
                                      SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
                                      RecognizesAccessKey="True"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <EventTrigger RoutedEvent="ButtonBase.Click">
                        !!!SOMETHING HERE!!!
                    </EventTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

我在主Window1.xaml文件中使用上面的XAML,并为“obj”命名空间创建一个xmlns,所以我想做的是在ShardButton类上调用自定义事件处理方法,我该怎么办在XAML?

我似乎无法找到用于Google搜索的正确方法......

感谢你们给我的任何帮助!

标记

2 个答案:

答案 0 :(得分:1)

你不能在EventTriggers中直接执行事件处理程序,它们并没有为此目的而创建。

但是,如果你的ShardButton的每个实例必须在点击时做同样的事情,只需覆盖ShardButton类中的OnClick方法,并做你在这里做的任何事情。

如果您不希望出现此行为,而是希望为使用Window1.xaml中定义的此特定样式的每个ShardButton实例执行特定处理程序,请添加另一个setter:

<Setter Property="Command" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type obj:Window1}}, Path=MyCommand}" />

其中MyCommand是Window1的实例属性,返回将调用您的处理程序的ICommand的自定义实现。这行代码假定使用此样式的每个按钮都在Window1的可视树中的某个位置,这应该是这种情况(或者样式将在其他地方定义)。

答案 1 :(得分:0)

您可以在EventSetter中使用Style

<Style ...>
    <EventSetter Event="Click" Handler="yourHandlerMethod"/>
</Style>

然后在您的代码隐藏中:

private void yourHandlerMethod(object sender, RoutedEventArgs e)
{
    ...
}