3

我终于能够创建一个“简单”的透明按钮控件,基于ContentControl. 但是,有人可以解释为什么在将子元素的背景设置为透明之前,我无法单击/点击控件的任何空白区域吗?我也遇到了这个问题:

  • 我尝试使用边框
  • 我设置了按钮的ControlTemplate而不是ContentTemplate

这是我的“按钮”类:

public class TransparentButton : ContentControl {
    public TransparentButton() {            
        HorizontalContentAlignment = HorizontalAlignment.Stretch;
    }

    public override void OnApplyTemplate() {
        var child = Content as Grid;

        if (child != null) {
            child.Background = new SolidColorBrush(Colors.Transparent);
        }

        base.OnApplyTemplate();
    }
}

在使用(假设是 Grid 孩子)时,它非常特定于我的案例,但它可以工作。我使用它的原因是启用了 TiltEffect 的列表(非 ListBox)。

问题的背景:

<ItemsControl x:Name="Items" toolkit:TiltEffect.IsTiltEnabled="True">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <controls:TransparentButton 
                cal:Message.Attach="[Event Tap] = [Action Go($dataContext)]">
                <Grid>
                    <StackPanel HorizontalAlignment="Left">
                        <TextBlock Text="{Binding Test}" />                            
                    </StackPanel>
                    <StackPanel HorizontalAlignment="Right">
                        <TextBlock Text="{Binding Test2}" />                            
                    </StackPanel>
                </Grid>
            </controls:TransparentButton>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

如果您在项目内的 StackPanel 之间单击,则不会触发任何事件,也不会发生任何事情。只有当网格的背景是Transparent“占用空间”时。

我来自网络背景,所以这很混乱;即使未设置背景,包含元素也应该是“可测试的”。

4

1 回答 1

12

在 XAML 术语中,没有背景的对象通常称为空心或不可命中的。所以必须设置一个背景来使物体响应点击。要实现对透明对象的命中测试,您应该将背景设置为透明。

有关命中测试的更多信息

http://msdn.microsoft.com/en-us/library/ms752097.aspx

于 2013-02-03T09:26:07.857 回答