Làm cách nào để loại bỏ hiệu ứng di chuột qua mặc định trên các nút WPF?


84

Vấn đề của tôi là trong WPF, bất cứ khi nào tôi thử và thay đổi màu nền của nút bằng cách sử dụng trình kích hoạt hoặc hoạt ảnh, hiệu ứng di chuột mặc định (có màu xám với ánh sáng màu cam) dường như được ưu tiên hơn.

Sau khi tìm kiếm rộng rãi, tôi không biết làm thế nào để loại bỏ hiệu ứng này.

Câu trả lời:


17

Bạn cần tạo mẫu nút tùy chỉnh của riêng mình để có toàn quyền kiểm soát giao diện ở tất cả các trạng thái. Đây là một hướng dẫn .


2
Cảm ơn, điều đó thật hoàn hảo. Nó phức tạp hơn tôi nghĩ, nhưng tất cả đều hoạt động tốt.
Nellius

18
Vì lý do nào đó, có 100 câu trả lời về việc tạo các mẫu tùy chỉnh cho các điều khiển WPF và tất cả chúng đều sai một cách không cần thiết. Không có lý do gì để đấu tranh để viết 50 dòng mã mẫu cho một nút để thay đổi 1 thứ. Tất cả những gì bạn phải làm là trong trình thiết kế xaml nhấp chuột phải vào điều khiển và tạo một bản sao của mã mẫu. VS sẽ tạo một kiểu từ nút chính xác đó và bạn có thể tinh chỉnh nó từ đó. Mất đúng 2 giây.
The Muffin Man,

@TheMuffinMan Fantastic, nhưng bạn có thấy hơi kỳ lạ khi phải mất 50 dòng mã mẫu để ngăn một nút thay đổi màu nền khi di chuột không? WPF khuôn khổ phức tạp ngu ngốc làm sao.
Ash

@Ash Hoặc người ta có thể tranh luận rằng nó đang hướng dẫn người dùng theo hướng họ nên đi. Nếu bạn có một nút yêu cầu trạng thái di chuột mới, đó có thể là LOẠI nút mới; có lẽ là nút điều hướng, nút khay, v.v. Nếu vậy, bạn không nên sửa đổi các thuộc tính một lần cho nó, nó nên có điều khiển hoặc nhóm kiểu riêng. Và đó là những gì điều này khiến bạn làm.
Matt Kenefick

107

Điều này tương tự như giải pháp được đề cập bởi Mark Heath nhưng không có nhiều mã để chỉ tạo một nút rất cơ bản, không có hiệu ứng hoạt ảnh di chuột qua tích hợp. Nó duy trì hiệu ứng di chuột qua đơn giản để hiển thị đường viền nút bằng màu đen.

Kiểu có thể được chèn vào phần Window.Resources hoặc UserControl.Resources chẳng hạn (như hình minh họa).

<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>

2
Tôi thích giải pháp đó rất nhiều. Tuy nhiên, kích hoạt chuột qua chỉ kích hoạt khi chuột trên văn bản trên nút. Tôi đã thêm một khối văn bản với chiều rộng được chỉ định bên trong nút để khắc phục sự cố đó.
Dave

Ngài là một vị thánh.
krobelusmeetsyndra

25

Chỉ cần thêm một giải pháp rất đơn giản, điều đó đã đủ tốt cho tôi và tôi nghĩ sẽ giải quyết được vấn đề của OP. Tôi đã sử dụng giải pháp trong câu trả lời này ngoại trừ với một Backgroundgiá trị thông thường thay vì một hình ảnh.

<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>

Không tạo khuôn mẫu lại ngoài việc buộc Backgroundphải luôn làm Transparentnền từ nút tạo khuôn mẫu - di chuột qua không còn ảnh hưởng đến nền sau khi điều này được thực hiện. Rõ ràng là thay thế Transparentbằng bất kỳ giá trị ưu tiên nào.


10

Người đàn ông Muffin đã có một câu trả lời rất đơn giản phù hợp với tôi.

Để thêm một chút hướng cụ thể, ít nhất là đối với VS 2013:

  • Nhấp chuột phải vào điều khiển
  • Chọn Edit Template => Edit a copy ...
  • Tôi đã chọn 'Ứng dụng' để lưu kiểu
    • Từ đây, bạn có thể trực tiếp chỉnh sửa App.xaml và xem các thuộc tính được đặt tên trực quan. Vì mục đích của mình, tôi chỉ đặt RenderMouseOver = "False"
  • Sau đó, trong MainWindow.xaml hoặc bất kỳ GUI của bạn ở đâu, bạn có thể dán kiểu mới vào cuối thẻ Nút, ví dụ: ... Style="{DynamicResource MouseOverNonDefault}"/>

Muffin Man là ai?
Mike W

CƯỜI LỚN. Anh ta trả lời lần thứ hai cho câu trả lời được chủ sở hữu chấp nhận. Không chắc bạn đang hỏi nghiêm túc hay đang nói đùa. Khó nói với một cái tên như Muffin Man.
Benji-Man

5

Liên kết này đã giúp tôi rất nhiều http://www.codescratcher.com/wpf/remove-default-mouse-over-effect-on-wpf-buttons/

Xác định một kiểu trong UserControl.Resources hoặc 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>

Sau đó, thêm kiểu vào nút của bạn theo cách này 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>

4

Nếu ai đó không muốn ghi đè Mẫu điều khiển mặc định thì đây là giải pháp.

Bạn có thể tạo DataTemplate cho nút có thể có TextBlock và sau đó bạn có thể viết kích hoạt Thuộc tính trên thuộc tính IsMouseOver để vô hiệu hóa hiệu ứng di chuột qua. Chiều cao của TextBlock và Button phải giống nhau.

<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>

1

Phần mở rộng về câu trả lời của dodgy_coder bổ sung hỗ trợ cho ..

  • Duy trì kiểu nút WPF
  • Thêm hỗ trợ cho IsSelected và di chuột, tức là một nút được bật tắt

        <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>
    

ví dụ ..

<Button Content="Wipe On" Selector.IsSelected="True" /> <Button Content="Wipe Off" Selector.IsSelected="False" />


0

Sử dụng trình kích hoạt mẫu:

<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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.