Tất cả các câu trả lời cho đến nay đều liên quan đến việc thay thế hoàn toàn hành vi của nút mặc định bằng một thứ khác. Tuy nhiên, IMHO sẽ hữu ích và quan trọng khi hiểu rằng bạn có thể chỉ thay đổi phần mà bạn quan tâm , bằng cách chỉnh sửa mẫu mặc định hiện có cho phần tử XAML.
Trong trường hợp xử lý hiệu ứng di chuột trên nút WPF, sự thay đổi về diện mạo trong Button
phần tử WPF là do Trigger
kiểu mặc định cho phần tử Button
này dựa trên thuộc IsMouseOver
tính và đặt các thuộc tính Background
và BorderBrush
của Border
phần tử cấp cao nhất trong mẫu điều khiển. Nền của Button
phần tử nằm bên dưới Border
nền của phần tử, vì vậy việc thay đổi thuộc Button.Background
tính không ngăn hiệu ứng di chuột được nhìn thấy.
Với một số nỗ lực, bạn có thể ghi đè hành vi này bằng bộ cài đặt của riêng mình, nhưng vì phần tử bạn cần ảnh hưởng nằm trong mẫu và không thể truy cập trực tiếp trong XAML của riêng bạn, nên cách tiếp cận đó sẽ khó và IMHO quá phức tạp.
Một tùy chọn khác sẽ là sử dụng đồ họa làm Content
cho Button
thay vì Background
. Nếu bạn cần nội dung bổ sung trên hình ảnh, bạn có thể kết hợp chúng với một Grid
đối tượng cấp cao nhất trong nội dung.
Tuy nhiên, nếu bạn thực sự chỉ muốn tắt hoàn toàn hiệu ứng di chuột (thay vì chỉ ẩn nó), bạn có thể sử dụng Visual Studio XAML Designer:
- Trong khi chỉnh sửa XAML của bạn, hãy chọn tab "Thiết kế" .
- Trong tab "Thiết kế" , tìm nút mà bạn muốn tắt hiệu ứng.
- Nhấp chuột phải vào nút đó và chọn "Chỉnh sửa Mẫu / Chỉnh sửa Bản sao ..." . Chọn trong lời nhắc bạn nhận được nơi bạn muốn đặt tài nguyên mẫu mới. Điều này có vẻ như không làm gì cả, nhưng trên thực tế, Nhà thiết kế sẽ thêm tài nguyên mới mà bạn đã nói với nó và thay đổi phần tử nút của bạn để tham chiếu kiểu sử dụng các tài nguyên đó làm mẫu nút.
- Bây giờ, bạn có thể chỉnh sửa kiểu đó. Điều dễ dàng nhất là xóa hoặc bỏ nhận xét (ví dụ: Ctrl+ E, C)
<Trigger Property="IsMouseOver" Value="true">...</Trigger>
phần tử. Tất nhiên, bạn có thể thực hiện bất kỳ thay đổi nào đối với mẫu bạn muốn tại thời điểm đó.
Khi bạn hoàn tất, kiểu nút sẽ giống như sau:
<p:Style x:Key="FocusVisual">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</p:Style>
<SolidColorBrush x:Key="Button.Static.Background" Color="#FFDDDDDD"/>
<SolidColorBrush x:Key="Button.Static.Border" Color="#FF707070"/>
<SolidColorBrush x:Key="Button.MouseOver.Background" Color="#FFBEE6FD"/>
<SolidColorBrush x:Key="Button.MouseOver.Border" Color="#FF3C7FB1"/>
<SolidColorBrush x:Key="Button.Pressed.Background" Color="#FFC4E5F6"/>
<SolidColorBrush x:Key="Button.Pressed.Border" Color="#FF2C628B"/>
<SolidColorBrush x:Key="Button.Disabled.Background" Color="#FFF4F4F4"/>
<SolidColorBrush x:Key="Button.Disabled.Border" Color="#FFADB2B5"/>
<SolidColorBrush x:Key="Button.Disabled.Foreground" Color="#FF838383"/>
<p:Style x:Key="ButtonStyle1" TargetType="{x:Type Button}">
<Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
<Setter Property="Background" Value="{StaticResource Button.Static.Background}"/>
<Setter Property="BorderBrush" Value="{StaticResource Button.Static.Border}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="1"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
<ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsDefaulted" Value="true">
<Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
</Trigger>
<!--<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Background" TargetName="border" Value="{StaticResource Button.MouseOver.Background}"/>
<Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.MouseOver.Border}"/>
</Trigger>-->
<Trigger Property="IsPressed" Value="true">
<Setter Property="Background" TargetName="border" Value="{StaticResource Button.Pressed.Background}"/>
<Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Pressed.Border}"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Background" TargetName="border" Value="{StaticResource Button.Disabled.Background}"/>
<Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Disabled.Border}"/>
<Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Button.Disabled.Foreground}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</p:Style>
(Lưu ý: bạn có thể bỏ qua các p:
điều kiện của vùng tên XML trong mã thực… Tôi chỉ cung cấp chúng ở đây vì trình định dạng mã Stack Overflow XML bị nhầm lẫn bởi <Style/>
các phần tử không có tên đủ điều kiện với vùng tên XML.)
Nếu bạn muốn áp dụng cùng một kiểu cho các nút khác, bạn có thể nhấp chuột phải vào chúng và chọn "Chỉnh sửa Mẫu / Áp dụng Tài nguyên" và chọn kiểu bạn vừa thêm cho nút đầu tiên. Bạn thậm chí có thể đặt kiểu đó làm kiểu mặc định cho tất cả các nút, sử dụng các kỹ thuật thông thường để áp dụng kiểu mặc định cho các phần tử trong XAML.
Forward-48.png
và kích hoạt IsMouseOver để thay đổi nó cho giống nhauForward-48.png
. Tôi đang thử sử dụng mã của bạn với các hình ảnh khác nhau và tất cả đều hoạt động tốt.