一个Button模板:<Window.Resources>
<Style TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border HorizontalAlignment="Left" Background="{TemplateBinding Background}">
                    <ContentPresenter />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
</Window.Resources>
<Grid >
    <Button Content="Button" HorizontalAlignment="Left" Margin="130,238,100,100" VerticalAlignment="Top" Width="100" Click="Button_Click" />
</Grid>private void Button_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("fgg");
}
在视图中看到Button是这样的:
Button模板的根元素是一个Border,其中设置了Border的HorizontalAlignment属性值为Left,有如下两个问题:
1:在图中看到的Button,右边是空白的,此部分应该不属于Border部分吧,但它是属于Button部分的吗?如果是的话,为什么点击右边空白部分,没有引发Click事件?
2:设置了Border的HorizontalAlignment属性值为Left,这是相对于父元素的水平对齐方式,可是在模板中Border父元素是什么呢?它又为什么确实是靠左了呢?Border是相对于谁靠左的呢?

解决方案 »

  1.   

    1、WPF的事件是路由事件,从你点击的元素开始引发的,你这里虽然设置的是Button的点击事件,却是由模板内部元素引起,如果模版内部元素无法触发这个事件,外面的Button就一样得不到该事件。
    2、那个灰色的部分的确是Border的全部,你没设置Border的宽高, 因此是自适应里面的内容的。外面部分是空白无内容,再外面的框是什么不清楚,任何容器都有可能姑且定义为ControlTemplate容器的框框。
      

  2.   

    我晕倒 看到你问的问题..我比较无语
    <Style TargetType="{x:Type Button}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Border  BorderThickness="1" CornerRadius="2" BorderBrush="Black">
                     <Border.Background>
                     <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                     <GradientStop Color="#FFF1F1A4" Offset="0"/>
                     <GradientStop Color="#FFC1C112" Offset="1"/>
                     </LinearGradientBrush>
                     </Border.Background>
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>帮你改了一下做的更像是按钮了  你那么做是不对的按钮你改的是样式模板 模板内 的ContentPresenter是按钮的内容你的border整个被放到靠左边了 那么它的width就是auto了 你应该什么对其方式都不设定就对劲了 
    你要是想让按钮被点击后出发click border必须有背景色 如果想透明那就把颜色的alpha设为0就行了而且你在做样式也不是这么简单的做的你还要加入触发器 相应按钮相应的触发动作 然后变换背景颜色 你的问题解释清楚了