代码之家  ›  专栏  ›  技术社区  ›  JonC

带有自定义模板的WPF切换按钮不接受在正确区域单击

  •  6
  • JonC  · 技术社区  · 15 年前

    我是WPF领域的相对初学者,所以我相信这将是许多问题中的第一个!

    我有一系列的切换按钮,所有这些按钮都有一个自定义模板,用于显示一个具有透明背景的图像,当用户切换按钮时,该图像就会突出显示。 我想在内容周围添加填充,这样突出显示的区域会扩展到内容周围。 这是可行的,但是用户仍然需要点击内部区域来激活按钮,这不是我想要的。

    我假设这是因为我使用的是 ContentPresenter 绑定到按钮的填充,这被归类为内容的外部,但不确定修复此问题的最佳方法。 但是,当取消选择按钮时,它确实起作用。

    下面是一些XAML,显示了应该能够直接复制和粘贴到XAMLPAD中的问题。

    <Page.Resources>
        <Style x:Key="ValidationToggleButton" TargetType="ToggleButton">
        <Setter Property="Padding" Value="5" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate >
                    <Grid Name="MainGrid">
                        <Viewbox>
                            <ContentPresenter Margin="{TemplateBinding Padding}"
                                  Content="{TemplateBinding Property=Button.Content}" />
                        </Viewbox>
                    </Grid>
    
                    <ControlTemplate.Triggers>
                        <Trigger Property="ToggleButton.IsChecked" Value="True">
                            <Setter TargetName="MainGrid" Property="Background" Value="#88FFFF55" />
                        </Trigger>
                    </ControlTemplate.Triggers>
    
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    </Page.Resources> 
    <Grid>
    <GroupBox Grid.Column="0" Header="Validation" BorderBrush="#55BBE6" Margin="2" >
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <ToggleButton Grid.Column="0" Style="{StaticResource ValidationToggleButton}">
                CLICK
            </ToggleButton>
        </Grid>
    </GroupBox>
    </Grid>
    

    有人知道我该怎么纠正这个吗?

    1 回复  |  直到 15 年前
        1
  •  14
  •   Anvaka    15 年前

    欢迎来到WPF世界:)。这是因为…背景画笔。如果不设置,则为空。这意味着它对于命中测试机制是不可见的。快速修复此集 Background="Transparent" MainGrid 。但更合适的方式是通过样式进行设置:

    <Page
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
     <Page.Resources>
        <Style x:Key="ValidationToggleButton" TargetType="ToggleButton">
        <Setter Property="Padding" Value="5" />
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate >
                    <Grid Name="MainGrid" Background="{TemplateBinding Background}">
                        <Viewbox>
                            <ContentPresenter Margin="{TemplateBinding Padding}"
                                  Content="{TemplateBinding Property=Button.Content}" />
                        </Viewbox>
                    </Grid>
    
                    <ControlTemplate.Triggers>
                        <Trigger Property="ToggleButton.IsChecked" Value="True">
                            <Setter TargetName="MainGrid" Property="Background" Value="#88FFFF55" />
                        </Trigger>
                    </ControlTemplate.Triggers>
    
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    </Page.Resources> 
    <Grid>
    <GroupBox Grid.Column="0" Header="Validation" BorderBrush="#55BBE6" Margin="2" >
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <ToggleButton Grid.Column="0" Style="{StaticResource ValidationToggleButton}">
                CLICK
            </ToggleButton>
        </Grid>
    </GroupBox>
    </Grid>
    </Page>