here과 같이 마우스를 위로 움직이면 내 단추에 방사형 그래디언트 효과를 적용하고 싶습니다. 그래서 나는 나의 버튼 스타일을 정의하는 분리 된 리소스 파일을 가지고있다.WPF : 마우스로 움직이는 방사형 그라데이션이 컨트롤 위로 이동
MyButtonStyle.xaml :
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MyTestButtons">
<Style TargetType="Button" x:Key="MyButtonStyle">
<!--<Setter Property="Background" Value="Transparent" />-->
<Setter Property="TextBlock.TextAlignment" Value="Center" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Name="Border" CornerRadius="0"
BorderBrush="#000" BorderThickness="1,1,1,1"
Background="{TemplateBinding Background}">
<ContentPresenter x:Name="contentPresenter"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
Margin="{TemplateBinding Padding}"
VerticalAlignment="{TemplateBinding VerticalAlignment}" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
그리고 아래 내 버튼에 적용됩니다.
창 : 코드 숨김
<Window x:Class="MyTestButtons"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/MyButtonStyle.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Button Name="btnYes" Content="Yes"
Margin="3,5" MinWidth="70" Height="35"
Click="Button_Click" Foreground="Black" FontSize="14"
Style="{StaticResource MyButtonStyle}"
VerticalAlignment="Center"
HorizontalAlignment="Stretch"
VerticalContentAlignment="Center"
HorizontalContentAlignment="Center"
MouseMove="btnYes_MouseMove"
MouseLeave="btnYes_MouseLeave">
<Button.Background>
<RadialGradientBrush x:Name="gradRadial" RadiusX="0.25">
<GradientStop Color="AliceBlue" Offset="0.0"/>
<GradientStop Color="LightSteelBlue" Offset="1.0"/>
</RadialGradientBrush>
</Button.Background>
</Button>
</Window>
창 :
private void btnYes_MouseMove(object sender, MouseEventArgs e)
{
Point pt = Mouse.GetPosition(btnYes);
gradRadial.GradientOrigin = new Point(pt.X/btnYes.Width, pt.Y/btnYes.Height);
gradRadial.Center = gradRadial.GradientOrigin;
}
private void btnYes_MouseLeave(object sender, MouseEventArgs e)
{
gradRadial.GradientOrigin = new Point(0.5, 0.5); // Default
gradRadial.Center = gradRadial.GradientOrigin;
}
내 문제와 목표는 다음과 같습니다
- 방사형 그라데이션이 제대로 적용되지 않습니다. 내 단추의 중앙에 방사형 그래디언트가 표시되고 마우스를 단추 위로 움직이면 방사형 그래디언트는 항상 중앙에 유지되고 방사형 그래디언트는 마우스가 끝나는 원점에서 생성되지 않습니다. 제공되는 link에 표시된 세 마리 마우스의 스크린 샷.
- 코드 숨김을 사용하면 두 개의 이벤트 (각 단추에 대해 MouseMove 및 MouseLeave)가 생성됩니다. 난 뒤에 코드없이, 단지 xaml을 사용하여 하나의 파일에 모든 코드를 넣어, 내 스타일 파일 MyButtonStyle.xaml에서하고 싶습니다. 당신은
btnYes.Width
사용gradRadial.GradientOrigin = new Point(pt.X/btnYes.Width, pt.Y/btnYes.Height);
하지만 당신은 버튼이 속성을 설정하지 않으며, 기본적으로는 값 (
double.NaN
)에 정의되지 않은, 그래서 당신은 종료 :
내가 대답은 # 1을 발행 할 생각 발견을 당신이 제공 한 링크에 이 중요한 세부 사항에 유의하십시오. 또한 마우스가 위에있을 때 버튼의 기본 렌더링을 비활성화해야합니다. 버튼의 컨트롤 템플릿에있는 ButtonChrome 객체의 RenderMouseOver 속성을 False로 변경하면됩니다. ' – pstrjds
@pstrjds ok. 이제 마우스를 스타일 파일에 올려 놓은 상태에서 버튼의 기본 렌더링을 비활성화하려면 어떻게합니까? – user1624552