【问题标题】:How can I bring a Button in a custom control "to the front"?如何将自定义控件中的按钮“放在前面”?
【发布时间】:2014-11-24 16:30:12
【问题描述】:

在一个自定义控件中,我有一个堆栈面板(水平)作为内容,一个文本块和一个按钮。

自定义控件有效,结果是一个矩形,这是我的local:DropDownToggleButton
这个反应角分为两个子矩形:左边是<TextBlock Text="Test"部分,右边是按钮<Button x:Name="ButtonTest,它被拉伸以填充矩形的高度。

但是,当我单击矩形的右上角时,local:DropDownToggleButton 本身会接收事件,而不是那里也存在的按钮。就好像 Button 只响应按钮内容中 Textblock 接收到的鼠标事件。如何使按钮的整个区域响应鼠标点击?

自定义控件对按钮的ClickedPreviewMouseDown 事件作出反应。两个事件都有同样的问题。同时添加Panel.ZIndex="1"也无济于事。

<local:DropDownToggleButton ToolTip="Show" DropDownButton="{Binding ElementName=ButtonTest}"
    VerticalAlignment="Stretch" VerticalContentAlignment="Stretch" Padding="0" BorderThickness="0"
     Style="{StaticResource {x:Static ToolBar.ToggleButtonStyleKey}}">
    <local:DropDownToggleButton.DropDownMenu>
        <ContextMenu>
            <ContextMenu.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Background="WhiteSmoke"></StackPanel>
                </ItemsPanelTemplate>
            </ContextMenu.ItemsPanel>
            <ContextMenu.ItemContainerStyle>
                <Style TargetType="{x:Type MenuItem}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type MenuItem}">
                                <TextBlock Padding="6" Text="{TemplateBinding Header}" Background="{TemplateBinding Background}"/>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                    <Setter Property="Margin" Value="0"/>
                    <Style.Triggers>
                        <Trigger Property="TextBlock.IsMouseOver" Value="True">
                            <Setter Property="Background" Value="{StaticResource mouseover}"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </ContextMenu.ItemContainerStyle>
            <MenuItem Header="Test 1" />
            <MenuItem Header="Test 2"/>
        </ContextMenu>
    </local:DropDownToggleButton.DropDownMenu>
    <StackPanel Orientation="Horizontal" VerticalAlignment="Stretch">
        <TextBlock Text="Test" VerticalAlignment="Center"/>
        <Button x:Name="ButtonTest" ToolTip="Other" Padding="0" Margin="0" VerticalContentAlignment="Stretch" VerticalAlignment="Stretch">
            <Button.Template>
                <ControlTemplate TargetType="Button">
                    <ContentPresenter/>
                </ControlTemplate>
            </Button.Template>
            <TextBlock FontSize="16" FontFamily="Marlett" Text="6" VerticalAlignment="Center" />
        </Button>
    </StackPanel>
</local:DropDownToggleButton>

【问题讨论】:

    标签: wpf xaml mouseevent


    【解决方案1】:

    按钮没有反应的原因是因为你已经拿走了大部分你希望按钮拥有的东西,你的按钮模板只是 ContentPresenter,所以按钮实际上只是文本块。试试

            <ControlTemplate TargetType="Button">
                <Border Background="Transparent">
                    <ContentPresenter/>
                </Border>
            </ControlTemplate>
    

    【讨论】:

    • 我明天试试。所以,在这种情况下,我不必使用 Border_Click 之类的东西?
    • 没有边框只是给按钮一个元素来捕获点击,它将传播到按钮点击处理程序
    • 它就像我想象的那样工作。是否也可以强制 ContentPresenter(无论可能是什么)以与边框相同的方式拉伸自身?
    • 我不相信,它只是您呈现的任何内容的容器,因此它会根据内容及其父级计算大小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 2013-09-30
    • 1970-01-01
    相关资源
    最近更新 更多