3

次のコードがあります (これは、ListBoxItem の Blend ControlTemplate に加えて、例を簡単にするための 2 つの新しい状態とイベント ハンドラーです):

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 が存在し、現在、状態が ListBoxItem ではなく Border に宣言されていることを確認します (VisualStateManager.GetVisualGroups の呼び出しを確認しました)。理由について何か考えはありますか?

前もって感謝します。

4

1 に答える 1

2

ExtendedVisualStateManager は使用していませんが、適切なクラスではないと思います。VisualStateManager.GoToStateListBoxItem (マウス イベントの送信者である Border ではない) をターゲット コントロールとして使用してみてください。

于 2013-06-02T13:07:49.313 に答える