Mój problem polega na tym, że w WPF za każdym razem, gdy próbuję zmienić kolor tła przycisku za pomocą wyzwalaczy lub animacji, domyślny efekt najechania myszą (szare z pomarańczową poświatą) wydaje się mieć priorytet.
Po obszernych poszukiwaniach nie mam pojęcia, jak usunąć ten efekt.
Jest to podobne do rozwiązania, o którym wspomniał Mark Heath, ale nie zawiera tak dużej ilości kodu, aby po prostu utworzyć bardzo prosty przycisk, bez wbudowanego efektu animacji myszy nad przyciskiem. Zachowuje efekt prostego najechania kursorem myszy na pokazanie ramki przycisku na czarno.
Styl można wstawić na przykład do sekcji Window.Resources lub UserControl.Resources (jak pokazano).
<UserControl.Resources> <!-- This style is used for buttons, to remove the WPF default 'animated' mouse over effect --> <Style x:Key="MyButtonStyle" TargetType="Button"> <Setter Property="OverridesDefaultStyle" Value="True"/> <Setter Property="Margin" Value="5"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Border Name="border" BorderThickness="1" Padding="4,2" BorderBrush="DarkGray" CornerRadius="3" Background="{TemplateBinding Background}"> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" /> </Border> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="border" Property="BorderBrush" Value="Black" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </UserControl.Resources> <!-- usage in xaml --> <Button Style="{StaticResource MyButtonStyle}">Hello!</Button>
źródło
Wystarczy dodać bardzo proste rozwiązanie, które było dla mnie wystarczająco dobre i myślę, że rozwiązuje problem OP. Użyłem rozwiązania w tej odpowiedzi, z wyjątkiem zwykłej
Background
wartości zamiast obrazu.<Style x:Key="SomeButtonStyle" TargetType="Button"> <Setter Property="Background" Value="Transparent" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Grid Background="{TemplateBinding Background}"> <ContentPresenter /> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style>
Brak ponownego tworzenia szablonów poza wymuszeniem,
Background
aby zawsze byłTransparent
tłem z przycisku szablonu - po wykonaniu tej czynności najechanie myszą nie wpływa już na tło. Oczywiście zastąpTransparent
dowolną preferowaną wartością.źródło
Muffin Man miał bardzo prostą odpowiedź, która działała dla mnie.
Aby dodać trochę bardziej szczegółowy kierunek, przynajmniej dla VS 2013:
... Style="{DynamicResource MouseOverNonDefault}"/>
źródło
Ten link bardzo mi pomógł http://www.codescratcher.com/wpf/remove-default-mouse-over-effect-on-wpf-buttons/
Zdefiniuj styl w UserControl.Resources lub Window.Resources
<Window.Resources> <Style x:Key="MyButton" TargetType="Button"> <Setter Property="OverridesDefaultStyle" Value="True" /> <Setter Property="Cursor" Value="Hand" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Border Name="border" BorderThickness="0" BorderBrush="Black" Background="{TemplateBinding Background}"> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" /> </Border> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Opacity" Value="0.8" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </Window.Resources>
Następnie dodaj styl do swojego przycisku w ten sposób Style = "{StaticResource MyButton}"
<Button Name="btnSecond" Width="350" Height="120" Margin="15" Style="{StaticResource MyButton}"> <Button.Background> <ImageBrush ImageSource="/Remove_Default_Button_Effect;component/Images/WithStyle.jpg"></ImageBrush> </Button.Background> </Button>
źródło
Jeśli ktoś nie chce zastąpić domyślnego szablonu sterowania, oto rozwiązanie.
Możesz utworzyć DataTemplate dla przycisku, który może mieć TextBlock, a następnie możesz napisać wyzwalacz Property we właściwości IsMouseOver, aby wyłączyć efekt myszy. Wysokość TextBlock i Button powinna być taka sama.
<Button Background="Black" Margin="0" Padding="0" BorderThickness="0" Cursor="Hand" Height="20"> <Button.ContentTemplate> <DataTemplate> <TextBlock Text="GO" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" TextDecorations="Underline" Margin="0" Padding="0" Height="20"> <TextBlock.Style> <Style TargetType="TextBlock"> <Style.Triggers> <Trigger Property ="IsMouseOver" Value="True"> <Setter Property= "Background" Value="Black"/> </Trigger> </Style.Triggers> </Style> </TextBlock.Style> </TextBlock> </DataTemplate> </Button.ContentTemplate> </Button>
źródło
Rozszerzenie odpowiedzi dodgy_coder, które dodaje obsługę ...
Dodaje obsługę IsSelected i hover, czyli przełączany przycisk
<Style x:Key="Button.Hoverless" TargetType="{x:Type ButtonBase}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ButtonBase}"> <Border Name="border" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}"> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" /> </Border> <ControlTemplate.Triggers> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsMouseOver" Value="True" /> <Condition Property="Selector.IsSelected" Value="False" /> </MultiTrigger.Conditions> <Setter Property="Background" Value="#FFBEE6FD" /> </MultiTrigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsMouseOver" Value="True" /> <Condition Property="Selector.IsSelected" Value="True" /> </MultiTrigger.Conditions> <Setter Property="Background" Value="#BB90EE90" /> </MultiTrigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="IsMouseOver" Value="False" /> <Condition Property="Selector.IsSelected" Value="True" /> </MultiTrigger.Conditions> <Setter Property="Background" Value="LightGreen" /> </MultiTrigger> <Trigger Property="IsPressed" Value="True"> <Setter TargetName="border" Property="Opacity" Value="0.95" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>
przykłady ..
<Button Content="Wipe On" Selector.IsSelected="True" /> <Button Content="Wipe Off" Selector.IsSelected="False" />
źródło
Korzystanie z wyzwalacza szablonu:
<Style x:Key="ButtonStyle" TargetType="{x:Type Button}"> <Setter Property="Background" Value="White"></Setter> ... <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Button}"> <Border Background="{TemplateBinding Background}"> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> </Border> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Background" Value="White"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>
źródło