1

StackPanel 内のいくつかのボタンのテンプレートを定義する XAML コードがあります。

<StackPanel x:Name="ThumbnailsStack">
   <StackPanel.Resources>
      <Style TargetType="Button">
         <Setter Property="Height" Value="120" />
         <Setter Property="Margin" Value="3" />
         <Setter Property="BorderThickness" Value="0" />
      </Style>
    </StackPanel.Resources>
 </StackPanel>

コードは機能し、スタック内のすべてのボタンは定義されたスタイルを想定しています。ここで、ContextMenu (Toolkit ライブラリから) をそれぞれにアタッチしたいと思います。私は次の方法を試しました:

App.xaml で

<Application.Resources>
    <toolkit:ContextMenu x:Key="ThumbBtnMenu">
        <toolkit:MenuItem Header="delete"></toolkit:MenuItem>
    </toolkit:ContextMenu>
</Application.Resources>

前のコードでは、新しいタグを追加しました:

<StackPanel x:Name="ThumbnailsStack">
   <StackPanel.Resources>
      <Style TargetType="Button">
         <Setter Property="Height" Value="120" />
         <Setter Property="Margin" Value="3" />
         <Setter Property="BorderThickness" Value="0" />
         <Setter Property="toolkit:ContextMenuService.ContextMenu" Value="{StaticResource ThumbBtnMenu}" />
      </Style>
    </StackPanel.Resources>
 </StackPanel>

これで、ページが読み込まれると、System.Windows.Markup.XamlParseException: Failed to assign to property 'System.Windows.Setter.Value'

4

1 に答える 1

1

問題は、リソースでコンテキスト メニューを定義すると、ContextMenu のインスタンスが 1 つだけになる (そして、この同じインスタンスがすべてのボタンに追加される) ため、アイテムがビジュアル ツリーに追加されるときに問題が発生することです。親は 1 つしか持てません。

スタイルレベルでコンテキストメニューを定義する唯一の方法は、実際にはボタンの完全なスタイル内で定義することだと思います。たとえば、次のようになります。

<Style  TargetType="Button">
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="BorderBrush" Value="{StaticResource PhoneForegroundBrush}"/>
        <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/>
        <Setter Property="BorderThickness" Value="{StaticResource PhoneBorderThickness}"/>
        <Setter Property="FontFamily" Value="{StaticResource PhoneFontFamilySemiBold}"/>
        <Setter Property="FontSize" Value="{StaticResource PhoneFontSizeMedium}"/>
        <Setter Property="Padding" Value="10,5,10,6"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Grid Background="Transparent">
                        <toolkit:ContextMenuService.ContextMenu>
                            <toolkit:ContextMenu>
                                <toolkit:MenuItem Header="delete"></toolkit:MenuItem>
                            </toolkit:ContextMenu>
                        </toolkit:ContextMenuService.ContextMenu>
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Normal"/>
                                <VisualState x:Name="MouseOver"/>
                                <VisualState x:Name="Pressed">
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentContainer">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneButtonBasePressedForegroundBrush}"/>
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="ButtonBackground">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneAccentBrush}"/>
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Disabled">
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentContainer">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneDisabledBrush}"/>
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderBrush" Storyboard.TargetName="ButtonBackground">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneDisabledBrush}"/>
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="ButtonBackground">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="Transparent"/>
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <Border x:Name="ButtonBackground" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" CornerRadius="0" Margin="{StaticResource PhoneTouchTargetOverhang}">
                            <ContentControl x:Name="ContentContainer" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" Padding="{TemplateBinding Padding}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Border>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
于 2013-09-19T22:07:17.560 に答える