我有以下代码(它只是ListBoxItem的Blend ControlTemplate加上两个新状态和一个事件处理程序来简化示例):
XAML:
<StackPanel>
<Button Click="ButtonBase_OnClick" Content="Clicle"/>
<ListBox Grid.Row="1" Margin="12,0,12,0" x:Name="list">
<ListBox.Resources>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Border x:Name="LayoutRoot" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" VerticalAlignment="{TemplateBinding VerticalAlignment}" MouseLeftButtonDown="LayoutRoot_OnMouseLeftButtonDown">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal"/>
<VisualState x:Name="MouseOver"/>
<VisualState x:Name="Disabled"/>
</VisualStateGroup>
<VisualStateGroup x:Name="SelectionStates">
<VisualState x:Name="Unselected"/>
<VisualState x:Name="Selected"/>
</VisualStateGroup>
<VisualStateGroup x:Name="Custom">
<VisualState x:Name="NotSet"/>
<VisualState x:Name="Set"/>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<ContentControl x:Name="ContentContainer" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.Resources>
</ListBox>
</StackPanel>
然后我背后的代码我试图设置其中一个新状态:
private void LayoutRoot_OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
bool result = ExtendedVisualStateManager.GoToElementState(sender as FrameworkElement, "Set", true);
}
无论如何,我总是得到result = false
所以状态不会改变。因为我对视觉状态很陌生,所以我做错了什么?
编辑:
我还尝试使用以下代码来使用ListBoxItem,但它也失败了:
DependencyObject parent = VisualTreeHelper.GetParent(sender as FrameworkElement);
var a = ExtendedVisualStateManager.GoToElementState(parent as FrameworkElement, "Set", false);
修改
我认为我在查看VisualStateManager时发现了问题。它检查VisualStates是否存在,并且当前状态被声明为Border,而不是ListBoxItem(检查调用VisualStateManager.GetVisualGroups)。有什么想法吗?
提前致谢。
答案 0 :(得分:2)
我没有使用过ExtendedVisualStateManager,但我认为它不是合适的类。尝试VisualStateManager.GoToState
并使用ListBoxItem(而不是Border,它是鼠标事件的发送者)作为目标控件。