ToggleButton - поведение при наведении и нажатии - PullRequest
3 голосов
/ 17 января 2012

Я создал ContentTemplate и стиль для ToggleButton, который выглядит как тот, который вы знаете по Microsoft WebMatrix.

Однако щелкать не всегда возможно, и эффект наведения не отображается.Я понял, что область щелчка / наведения появляется при наведении курсора на значок или текст моей кнопки.

Hover and click don't work

Hover and click work

Один разhovered Можно вернуться мышью вправо, и курсор не исчезнет (как и должно быть).

Вот важная часть кода:

            <StackPanel.Resources>
                <Style TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource NavigationButton}" />
            </StackPanel.Resources>
            <ToggleButton x:Name="_btn_Buchungen" Click="_btn_Buchungen_Click">
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                    <Image Source="{StaticResource Buchungen}" Width="16" Height="16" />
                    <TextBlock Text="Buchungen" />
                </StackPanel>
            </ToggleButton>

ControlTemplate иСтили:

<Style TargetType="{x:Type ToggleButton}" x:Key="NavigationButton">
            <Setter Property="Background" Value="{x:Null}" />
            <Setter Property="Height" Value="35" />
            <Setter Property="BorderBrush" Value="{x:Null}" />
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ToggleButton}">
                        <Border Name="OuterBorder" BorderThickness="0,1,0,0" >
                            <Border Name="InnerBorder" BorderThickness="0,1,0,1" >
                                <ContentPresenter HorizontalAlignment="Left" VerticalAlignment="Center"/>
                            </Border>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter Property="Style" TargetName="InnerBorder" Value="{StaticResource ButtonInnerBHover}" />
                                <Setter Property="Style" TargetName="OuterBorder" Value="{StaticResource ButtonOuterBHover}" />
                            </Trigger>
                            <Trigger Property="IsChecked"  Value="true">
                                <Setter Property="Style" TargetName="InnerBorder" Value="{StaticResource ButtonInnerBHover}" />
                                <Setter Property="Style" TargetName="OuterBorder" Value="{StaticResource ButtonOuterBHover}" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Resources>
                <Style TargetType="{x:Type TextBlock}">
                    <Setter Property="TextAlignment" Value="Left" />
                    <Setter Property="Margin" Value="10, 0,0,0" />
                    <Setter Property="Effect">
                        <Setter.Value>
                            <DropShadowEffect BlurRadius="1" Direction="270" ShadowDepth="1" Color="White" />
                        </Setter.Value>
                    </Setter>
                </Style>
                <Style TargetType="{x:Type StackPanel}">
                    <Setter Property="Margin" Value="20,0,0,0" />
                </Style>
            </Style.Resources>
        </Style>

При наведении указателя мыши на всю ширину самой кнопки наведите курсор мыши на ToggleButton, а также нажмите на него.

Я пытался исправить это с помощью различных свойств, таких как горизонтальное растяжение и IsHitTestVisible, но пока не получил. Есть идеи?

Уже видел эту ветку и пробовал разные вещи с решением, но не смог понять. Проблема с щелчком мыши по кнопке toggleButton в WPF

1 Ответ

5 голосов
/ 17 января 2012

Установите Background самого внешнего элемента управления в шаблоне на Transparent, таким образом он должен проверять попадание, независимо от содержимого.

...