У меня есть простой пример, чтобы показать эту проблему. Есть два Window
, один из которых MainWindow, а другой SecondWindow. Я положил большую кнопку внутри SecondWindow внизу, а кнопка имеет триггер IsMouseOver
. Но при движении курсора он работает неправильно. Для создания всего этого примера я использовал приведенный ниже код. Попробуйте и посмотрите на проблему. Как я могу это исправить?Почему IsMouseOver Trigger не работает, несмотря на то, что курсор не находится над кнопкой?
MainWindow.xaml
<Window x:Class="WpfApplication3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" AllowsTransparency="True" WindowStyle="None">
<Grid>
<Button Content="Show Dialog" HorizontalAlignment="Left" Margin="10,71,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click" RenderTransformOrigin="-1.211,0.918"/>
</Grid>
SecondWindow.xaml
<Window x:Class="WpfApplication3.SecondWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300"
Background="Green" AllowsTransparency="True" WindowStyle="None">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
</Grid.RowDefinitions>
<Button Content="SAVE" Height="50" VerticalAlignment="Bottom">
<Button.Style>
<Style TargetType="Button">
<Setter Property="Background" Value="Blue"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Background="{TemplateBinding Background}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Red"/>
<Setter Property="Foreground" Value="White"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Button.Style>
</Button>
</Grid>
MainWindow.cs
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
SecondWindow w = new SecondWindow();
w.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner;
w.Owner = this;
w.ShowDialog();
}
}
Проблема Изображение: Курсор над MainWindow, а не SecondWindow, но цвет фона кнопки не изменится на синий, это все еще красный.
Это потому, что, когда мышь покидает кнопку по горизонтали, она не ударит по кнопкам непосредственного родителя, потому что окно бескаркасное, а кнопка не имеет поля. В контексте SecondWindow затем не осталось кнопки, и триггер не выполняется. Если вы установите Margin на кнопке с некоторой шириной, она будет работать - но, возможно, не оптимально для вас? –
Но он должен работать без установки поля. Также я пробовал это раньше, но если размер поля невелик, он не чувствителен. Считаете ли вы, что это, вероятно, ошибка или забытая вещь для исправления языковыми дизайнерами? –
@AliTor ваш код должен, и делает, отлично работает для меня – dkozl