ListBox 使用 ItemsSource 繫結資料,需在無滑鼠互動情況下,透過程式碼強制將特定項目切換至 MouseOver、Normal 等視覺狀態(如外部按鈕控制高亮)。
// 錯誤示範:轉型失敗,回傳 null
var item = ListBox1.Items[0] as ListBoxItem;
// 正確取得視覺容器
var listBoxItem = ListBox1.ItemContainerGenerator.ContainerFromIndex(0) as FrameworkElement;
VisualStateManager.GoToState(control, stateName, useTransitions);
control:目標 FrameworkElement(此處為 ListBoxItem)。stateName:視覺狀態名稱(需與 ControlTemplate 內 VisualState x:Name 一致)。useTransitions:是否播放轉場動畫。<Style x:Key="ListBoxItemStyle1" TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal">
<Storyboard>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="rectangle">
<EasingColorKeyFrame KeyTime="0" Value="#FF5CFD30" />
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="MouseOver">
<Storyboard>
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="rectangle">
<EasingColorKeyFrame KeyTime="0" Value="#FF29B5B8" />
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Disabled" />
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Rectangle x:Name="rectangle" Fill="#FF5AFB2E" Stroke="Black" />
<TextBlock HorizontalAlignment="Center" Text="{TemplateBinding Content}" VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Grid>
<ListBox x:Name="ListBox1" ItemsSource="{Binding MenuList}"
ItemContainerStyle="{DynamicResource ListBoxItemStyle1}" />
<Button x:Name="btnMouseOver" Content="MouseOver" Click="btnMouseOver_Click" />
<Button x:Name="btnNormal" Content="Normal" Click="btnNormal_Click" />
</Grid>
private void btnMouseOver_Click(object sender, RoutedEventArgs e)
{
var item = ListBox1.ItemContainerGenerator.ContainerFromIndex(2) as FrameworkElement;
VisualStateManager.GoToState(item, "MouseOver", false);
}
private void btnNormal_Click(object sender, RoutedEventArgs e)
{
var item = ListBox1.ItemContainerGenerator.ContainerFromIndex(2) as FrameworkElement;
VisualStateManager.GoToState(item, "Normal", false);
}

ContainerFromIndex 若項目尚未虛擬化產生(未滾動到可視區),會回傳 null。需先 ListBox1.ScrollIntoView(dataItem) 強制產生容器。ItemsControl 衍生類別(ComboBox, TreeView 等)。