【问题标题】:Change VisualState of ListBox element更改 ListBox 元素的 VisualState
【发布时间】:2014-07-26 09:08:15
【问题描述】:

我有一个 Lisbox,我在其中制作了一个 ItemsTemplate,在这个 itemTemplate 中我有一个想要更改视觉状态的元素,问题是我不知道如何更改状态。这是我到目前为止所得到的。

<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 设计,我找到了这个soltuion,但我不知道“b”的命名空间,并且因此不知道如何获得“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 中,我有 syle:

<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 使其变黄。

【问题讨论】:

    标签: c# xaml windows-phone-8 visualstatemanager visualstates


    【解决方案1】:

    首先,将椭圆改为按钮是一个好主意,就像您在更新版本中所做的那样。但是您的情节提要的 targetProperty 设置不正确,您应该将其发送给:

    Storyboard.Targetproperty ="(Fill).(SolidColorBrush.Color)"
    

    如果您想从后面的代码中更改 VisualState,您应该找到 Button,然后更改它的状态。我发现这两个例子对我有帮助:

    1

    2

    也就是你通过visualTreeHelper和obj.FindName找到按钮。

    但是,如果您想从 ViewModel 更改 VisualState,您应该创建一个 附加属性,这两个网站将帮助您:

    3

    4

    【讨论】:

      【解决方案2】:

      你可以使用下面提到的代码

       VisualStateManager.GoToState(this, "PlayersTurn", false);
      

      【讨论】:

      • 我尝试在后面的代码中应用它,但它什么也没做。你确定我真的在申请itemtemplate吗?
      • 所以你建议我在我的资源中创建一个样式?
      • 你可以参考这个答案stackoverflow.com/questions/24053112/…
      • 我尝试对我的 Ellipse 做类似的事情,就像你对 Button 所做的那样,但我不能(不知道如何)在 中使用 VisualStaeManager。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      相关资源
      最近更新 更多