У меня есть ControlTemplate
для типа Button
, который имитирует стиль кнопок панели задач Windows 7. Я могу применить это к стандартному Button
, и это выглядит как раз правильно. Для тех, кто не видел Windows 7, кнопки панели задач также имеют поведение ... свечение появляется, когда вы наводите курсор мыши на кнопки, и оно перемещается горизонтально, когда вы наводите на него мышь.
Итак, я повторил это поведение, расширив Button
в два этапа; сначала в xaml я использовал Trigger
s, чтобы постепенно увеличить Opacity
моего 'свечения' RadialGradientBrush
, используя событие MouseEnter
, и снова уменьшить его, используя событие MouseLeave
; затем в коде я реализовал обработчик событий MouseMove
, чтобы переместить свойства RadialGradientBrush.GradientOrigin
и RadialGradientBrush.Center
в текущую позицию мыши. Все мило. Тем не менее, я всегда пытаюсь улучшить свой код, поскольку я узнаю больше о WPF, и мне любопытно несколько вещей.
Хорошо, вот вопросы ...
Во-первых, я знаю, что в WPF нет ничего, что дало бы мне доступ к текущей позиции мыши в xaml, но есть ли что-то, что я могу сделать, чтобы получить это? Под этим я подразумеваю что-то вроде добавления класса ObjectDatProvider
в Resources
, который выставляет текущую позицию мыши как DependencyProperty
, которую я могу напрямую связать со свойствами Center
и GradientOrigin
RadialGradientBrush
.
Я цепляюсь за соломинку здесь ... Цель состоит в том, чтобы удалить код, если это возможно, чтобы я мог просто использовать от ControlTemplate
до Style
всех Button
s в приложении. Или правильно, что это поведение должно быть в коде позади в WPF?
Во-вторых, если действительно лучше использовать код для поведения в моем кастоме Button
, то лучше создать CustomControl
или оставить его как есть, расширяя Button
?
Наконец, если он останется расширенным Button
, возможно ли заставить его заменить обычный Button
Style
? Я думаю о том, как определение Style
в Resources
с набором свойств TargetType
, но без набора x:key
, автоматически установит для всех типов Control
значение Style
.. Можно сказать, что если в приложении есть какие-либо Button
, то они должны быть такого типа Button
. Опять же, цепляясь за соломинку, но спрашивать нечего.
РЕДАКТИРОВАТЬ >>>
Вот xaml в моем расширенном Button
контроле (минус Resources
):
<Button.Template>
<ControlTemplate>
<Grid MouseMove="Button_MouseMove">
<Border CornerRadius="3" BorderBrush="#7E000000" BorderThickness="1" Background="#7EFFFFFF">
<Grid Margin="1">
<Rectangle x:Name="BackgroundRectangle" RadiusX="1.5" RadiusY="1.5" StrokeThickness="0" Fill="{StaticResource Windows7Background}" />
<Rectangle x:Name="Glow" IsHitTestVisible="False" RadiusX="1.5" RadiusY="1.5" StrokeThickness="0" Opacity="0.0" Fill="{StaticResource GlowBrush}" />
<ContentPresenter RecognizesAccessKey="True" ManyManyProperties="{TemplateBinding}"... />
</Grid>
</Border>
<Grid.Triggers>
<EventTrigger RoutedEvent="MouseEnter">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="Glow" Storyboard.TargetProperty="Opacity" From="0.0" To="1.0" Duration="0:0:0.5" DecelerationRatio="1" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="MouseLeave">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="Glow" Storyboard.TargetProperty="Opacity" From="1.0" To="0.0" Duration="0:0:1" DecelerationRatio="1" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Grid.Triggers>
</Grid>
</ControlTemplate>
</Button.Template>