0

反応を起こす必要があります。ポップアップが非表示になっているItemsControlのボタンを押すと。うまくいくはずだと思ってレイアウトをしましたが、うまくいきません。助けてください。

<Style x:Key="gbListViewItemStyle"
         TargetType='{x:Type ListViewItem}' BasedOn='{StaticResource BaseListBoxItemStyle}'>
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <Grid>
                            <ToggleButton x:Name="pupMenuButton" Command="{Binding Path=ActionCommand}" Style="{DynamicResource FlatToggleButtonStyle}">
                                <Grid>
                                    <TextBlock>text</TextBlock>
                                </Grid>
                            </ToggleButton>
                            <Popup Placement="Bottom" AllowsTransparency="True" StaysOpen="False"
                               PopupAnimation="Fade" x:Name="pupMenu" 
                                   IsOpen="{Binding ElementName=pupMenuButton, Path=IsChecked}">
                                <ItemsControl ItemsSource="{Binding Path=ListItems}" >
                                    <ItemsControl.ItemsPanel>
                                        <ItemsPanelTemplate>
                                            <StackPanel/>
                                        </ItemsPanelTemplate>
                                    </ItemsControl.ItemsPanel>
                                    <ItemsControl.ItemTemplate>
                                        <DataTemplate>
                                            <Button Content="{Binding Text1}" Command="{Binding Path=ActionCommand}" CommandParameter="{Binding}" Style="{DynamicResource ButtonStyleFlatBorder}">
                                                <Button.Triggers>
                                                    <EventTrigger RoutedEvent="ButtonBase.Click">
                                                        <BeginStoryboard>
                                                            <Storyboard>
                                                                <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="(ToggleButton.IsChecked)" Storyboard.TargetName="pupMenuButton">
                                                                    <DiscreteBooleanKeyFrame KeyTime="0" Value="False"/>
                                                                </BooleanAnimationUsingKeyFrames>
                                                            </Storyboard>
                                                        </BeginStoryboard>
                                                    </EventTrigger>
                                                </Button.Triggers>
                                            </Button>
                                        </DataTemplate>
                                    </ItemsControl.ItemTemplate>
                                </ItemsControl>
                            </Popup>
                        </Grid>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>

返されたエラー: 「名前空間 "System.Windows.Controls.Button" に "pupMenuButton" という名前が見つかりません。」ここでストーリーボードが機能しません。なぜですか? どのように仕事をするのですか?

4

1 に答える 1

1

xamlには、ネームスコープhttp://msdn.microsoft.com/en-us/library/ms746659.aspxの概念があります。あるネームスコープ内の名前付き要素は、別のネームスコープ内の要素を認識しません。この場合、ItemTemplateプロパティのDataTemplateはそれ自体の名前スコープであるため、要素名pupMenuButtonへのバインドは機能しません。グリッドはpupMenuButtonToggleButtonと同じネームスコープにあるため、グリッドレベルでクリックイベントをリッスンできます。データテンプレートによって作成された各ボタンがバブリングクリックイベントを発生させ、最終的にグリッドに到達するため、これは同じように動作します。

<Style x:Key="gbListViewItemStyle"
     TargetType='{x:Type ListViewItem}' BasedOn='{StaticResource BaseListBoxItemStyle}'>
<Setter Property="ContentTemplate">
    <Setter.Value>
        <DataTemplate>
            <Grid>
                <Grid.Triggers>
                    <EventTrigger RoutedEvent="ButtonBase.Click">
                        <BeginStoryboard>
                            <Storyboard>
                                <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="(ToggleButton.IsChecked)" Storyboard.TargetName="pupMenuButton">
                                    <DiscreteBooleanKeyFrame KeyTime="0" Value="False"/>
                                </BooleanAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                </Grid.Triggers>
                <ToggleButton x:Name="pupMenuButton" Command="{Binding Path=ActionCommand}" Style="{DynamicResource FlatToggleButtonStyle}">
                    <Grid>
                        <TextBlock>text</TextBlock>
                    </Grid>
                </ToggleButton>
                <Popup Placement="Bottom" AllowsTransparency="True" StaysOpen="False"
                           PopupAnimation="Fade" x:Name="pupMenu" 
                               IsOpen="{Binding ElementName=pupMenuButton, Path=IsChecked}">
                    <ItemsControl ItemsSource="{Binding Path=ListItems}" >
                        <ItemsControl.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel/>
                            </ItemsPanelTemplate>
                        </ItemsControl.ItemsPanel>
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <Button Content="{Binding Text1}" Command="{Binding Path=ActionCommand}" CommandParameter="{Binding}" Style="{DynamicResource ButtonStyleFlatBorder}"/>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </Popup>
            </Grid>
        </DataTemplate>
    </Setter.Value>
</Setter>

待ってください私はこれが何をしているのか気づきました。ポップアップのボタンをクリックしたことに応答して、ポップアップを閉じたいとします。これは、Restyled MenuItemを使用するのに適した場所です。これは、まさにMenuの目的であるためです。

于 2012-12-09T05:35:24.517 に答える