Изменить VisualState элемента ListBox
У меня есть Lisbox, в котором я создал ItemsTemplate, в этом itemTemplate у меня есть элемент, в котором я хочу изменить visualState. Проблема в том, что я не знаю, как изменить состояние. Вот что у меня так далеко.
<ListBox Name="My_LB" ItemsSource="{Binding Users}" Canvas.Left="45.8256" Canvas.Top="39.3065" Canvas.ZIndex="2" ScrollViewer.VerticalScrollBarVisibility="Disabled">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Ellipse x:Name="user_ellipse" Width="7.87566" Height="7.87563" Canvas.Left="25.3505" Canvas.Top="5.08428e-005" Stretch="Fill" StrokeThickness="1.6" StrokeLineJoin="Round" Stroke="#FF000000">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="IsTurn">
<VisualState x:Name="PlayersTurn">
<Storyboard>
<ColorAnimation To="Yellow" Storyboard.TargetName="user_ellipse" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[0].(GradientStop.Color)"/>
<ColorAnimation To="Yellow" Storyboard.TargetName="user_ellipse" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)"/>
<ColorAnimation To="Yellow" Storyboard.TargetName="user_ellipse" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[2].(GradientStop.Color)"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Ellipse.Fill>
<RadialGradientBrush RadiusX="0.651141" RadiusY="0.651175" Center="0.380114,0.308228" GradientOrigin="0.380114,0.308228">
<RadialGradientBrush.RelativeTransform>
<TransformGroup>
<RotateTransform CenterX="0.380114" CenterY="0.308228" Angle="47.4886"/>
</TransformGroup>
</RadialGradientBrush.RelativeTransform>
<GradientStop Color="#FF9F9065" Offset="0"/>
<GradientStop Color="#FF4F4832" Offset="0.685767"/>
<GradientStop Color="#FF000000" Offset="1"/>
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
</Canvas>
</Viewbox>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Это то, что я получил до сих пор, если бы кто-то мог просто помочь мне изменить состояние в любом случае для начала, это будет оценено.
Далее, если возможно, я бы хотел изменить состояние в зависимости от параметра в моей ViewModel, я использую дизайн MVVM, я нашел этот раствор, но я не знаю пространство имен "b", и поэтому d не делает знать, как получить "VisualStateSettingBehavior".
ОБНОВЛЕНИЕ Я изменил свой Ellipse на кнопку и сделал стиль для кнопки в моем ресурсе, так что теперь у меня есть:
Главная страница:
<ListBox Name="My_LB" ItemsSource="{Binding Users}" Canvas.Left="45.8256" Canvas.Top="39.3065" Canvas.ZIndex="2" ScrollViewer.VerticalScrollBarVisibility="Disabled">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Button Name="Shield_Light" Canvas.Left="25.3505" Canvas.Top="5.08428e-005" Style="{StaticResource Style1}"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
И в моем ResourceDictionary у меня есть стиль:
<Style x:Key="Style" TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Ellipse x:Name="Ellipse_Light" Width="7.87566" Height="7.87563" Stretch="Fill" StrokeThickness="1.6" StrokeLineJoin="Round" Stroke="#FF000000" Fill="Red">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommomStates">
<VisualState x:Name="IsNotTurn"/>
<VisualState x:Name="IsTurn">
<Storyboard>
<ColorAnimation Storyboard.TargetName="Ellipse_Light" Storyboard.TargetProperty="Fill" To="Yellow"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Ellipse>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Но я все еще не знаю, как изменить VisualState так, чтобы он стал желтым.
2 ответа
Для начала неплохо сделать вместо этого эллипс для кнопки, как вы сделали в обновленной версии. Однако ваш targetProperty для раскадровки не установлен правильно, вы должны указать его следующим образом:
Storyboard.Targetproperty ="(Fill).(SolidColorBrush.Color)"
Если вы хотите изменить VisualState из кода позади, вы должны найти Button, а затем изменить ее состояние. Я нашел эти два примера, которые помогли мне:
То есть вы найдете кнопку через visualTreeHelper и obj.FindName.
Однако если вы хотите изменить VisualState из ViewModel, вам нужно создать свойство Attached, эти два сайта помогут вам в этом:
Вы можете использовать приведенный ниже код
VisualStateManager.GoToState(this, "PlayersTurn", false);