[UWP]自定义控件视觉状态不工作
[UWP]Custom control visualstate not work
我在我的 windows 10 UWP 应用程序中创建了一个名为 CustomControl1
的自定义控件
public sealed class CustomControl1 : ButtonBase
{
public CustomControl1()
{
this.DefaultStyleKey = typeof(CustomControl1);
}
}
和Generic.xaml
中的默认样式
<Style TargetType="local:CustomControl1" >
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:CustomControl1">
<Border>
<TextBlock x:Name="textBlock" Text="This is a text block"/>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="VisualStateGroup">
<VisualState x:Name="Normal"/>
<VisualState x:Name="PointerOver">
<VisualState.Setters>
<Setter Target="textBlock.Foreground" Value="Red"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Pressed">
<VisualState.Setters>
<Setter Target="textBlock.TextBlock" Value="Blue"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
问题是 TextBlock 的前景不会在鼠标悬停时更改为 Red
,也不会在按下时更改为 Blue
。但是,如果我将 CustomControl1
的基础 class 更改为 Button
,它就可以正常工作。
public sealed class CustomControl1 : Button
{
public CustomControl1()
{
this.DefaultStyleKey = typeof(CustomControl1);
}
}
这两种情况有什么不同?
因为 Button 具有您使用的视觉状态,而 ButtonBase 没有。
因此,当您为 ButtonBase 编写该模板时,控件本身不会激活任何视觉状态,因此您的文本颜色不会改变。另一方面,按钮会改变颜色。
我在我的 windows 10 UWP 应用程序中创建了一个名为 CustomControl1
public sealed class CustomControl1 : ButtonBase
{
public CustomControl1()
{
this.DefaultStyleKey = typeof(CustomControl1);
}
}
和Generic.xaml
中的默认样式
<Style TargetType="local:CustomControl1" >
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:CustomControl1">
<Border>
<TextBlock x:Name="textBlock" Text="This is a text block"/>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="VisualStateGroup">
<VisualState x:Name="Normal"/>
<VisualState x:Name="PointerOver">
<VisualState.Setters>
<Setter Target="textBlock.Foreground" Value="Red"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Pressed">
<VisualState.Setters>
<Setter Target="textBlock.TextBlock" Value="Blue"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
问题是 TextBlock 的前景不会在鼠标悬停时更改为 Red
,也不会在按下时更改为 Blue
。但是,如果我将 CustomControl1
的基础 class 更改为 Button
,它就可以正常工作。
public sealed class CustomControl1 : Button
{
public CustomControl1()
{
this.DefaultStyleKey = typeof(CustomControl1);
}
}
这两种情况有什么不同?
因为 Button 具有您使用的视觉状态,而 ButtonBase 没有。 因此,当您为 ButtonBase 编写该模板时,控件本身不会激活任何视觉状态,因此您的文本颜色不会改变。另一方面,按钮会改变颜色。