0

以下で定義されているEditCommandButtonスタイルは、奇妙な動作を示しています。最後に定義されたインスタンス(下のアバターラベルの横)についてのみ表示されます。

スタイルx:Shared = "true"を作成し、DynamicResourceを使用してみましたが、同じ結果になりました。

最終的には、リクエストがあるまでボタンを非表示にしたいので、そのトリガーが表示されます。しかし、これを理解するまでは、デフォルトの可視性が表示されます。

誰かがこの動作を説明して修正を提供できますか?

乾杯、
ベリール

デザインビュー

ここに画像の説明を入力してください

ランタイムビュー

ここに画像の説明を入力してください

ボタンスタイル

<Style x:Key="EditCommandButtonStyle" TargetType="{x:Type Button}" >
    <Setter Property="Content">
        <Setter.Value>
            <TextBlock Text="a" Foreground="Navy" FontWeight="Bold" FontFamily="Wingdings 3" FontSize="24" Width="30"/>
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border x:Name="theBorder" Background="Transparent" CornerRadius="4">
                    <ContentPresenter x:Name="theContent" Visibility="Visible" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter TargetName="theContent" Property="Visibility" Value="Visible"/>
                    </Trigger>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter TargetName="theContent" Property="Visibility" Value="Visible"/>
                        <Setter TargetName="theBorder" Property="Background" Value="Orange"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Command" Value="{Binding SelectedSatelliteVm.EditCommand}"/>
</Style>

使用法

<DataTemplate x:Key="PersonInfoEditingControlTemplate">

    <Grid>

        ...

        <Label Grid.Column="0" Grid.Row="0" ... />
        <Button Style="{StaticResource EditCommandButtonStyle}" Grid.Column="1" Grid.Row="0"/>
        <TextBlock .../>

        <Label Grid.Column="0" Grid.Row="1" ... />
        <Button Style="{StaticResource EditCommandButtonStyle}" Grid.Column="1" Grid.Row="1"/>
        <TextBlock .../>

        <TextBlock  Grid.Column="0" Grid.Row="2"  .../>
        <Button Style="{StaticResource EditCommandButtonStyle}" Grid.Column="1" Grid.Row="2"/>
        <Image Grid.Column="2" Grid.Row="2" ... />

    </Grid>

</DataTemplate>

レイチェルのために編集

ほら、トリガーなし!最後のボタンだけが矢印を表示します...

<Style x:Key="TestCommandButtonStyle" TargetType="{x:Type Button}" >
    <Setter Property="Content">
        <Setter.Value>
            <TextBlock Text="a" Foreground="Navy" FontWeight="Bold" FontFamily="Wingdings 3" FontSize="24" Width="30"/>
        </Setter.Value>
    </Setter>
    <Setter Property="Command" Value="{Binding SelectedSatelliteVm.EditCommand}"/>
</Style>

ここに画像の説明を入力してください

FIX

<Style x:Key="EditCommandButtonStyle" TargetType="{x:Type Button}" >
    <Setter Property="Content" Value="a" />
    <Setter Property="Foreground" Value="Navy" />
    <Setter Property="FontFamily" Value="Wingdings 3" />
    <Setter Property="FontWeight" Value="Bold" />
    <Setter Property="FontSize" Value="18" />
    <Setter Property="Width" Value="30" />
    <Setter Property="Height" Value="Auto" />
    <Setter Property="Command" Value="{Binding SelectedSatelliteVm.EditCommand}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border x:Name="theBorder" CornerRadius="4">
                    <ContentPresenter x:Name="theContent" VerticalAlignment="Center" HorizontalAlignment="Center" />
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="False">
                        <Setter TargetName="theContent" Property="Visibility" Value="Hidden"/>
                        <Setter TargetName="theBorder" Property="Background" Value="Transparent"/>
                    </Trigger>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter TargetName="theContent" Property="Visibility" Value="Visible"/>
                    </Trigger>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter TargetName="theContent" Property="Visibility" Value="Visible"/>
                        <Setter TargetName="theBorder" Property="Background" Value="Orange"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

最初に書かれたスタイルには、実際には2つの問題があり、どちらも上記のスタイルで修正されました。(修正されたということは、それが意図したとおりに機能することを意味します。それが「正しい」方法であるということではありません!):

  1. DPの優先順位-これはレイチェルの答えが彼女の答えにもかかわらず対処しているものです。しかし、私が見つけた唯一の効果的な修正は、示されているようにIsMouseOverの2つのトリガーを使用して可視性を設定することです。
  2. グリッドの最後のアイテムだけがコンテンツを表示していました!-これは私には意味がありませんが、以前にTextBlockコンテンツにあったプロパティをスタイルのSettersに移動すると修正されます。
4

1 に答える 1

2

で定義された依存関係プロパティは<Tag>、トリガーで定義されたアイテムよりも優先順位が高いため、常に上書きされます。

たとえば、この場合、プロパティはタグで定義されているため、ボタンはトリガーが何であるかVisibilityに関係なく常に存在しますCollapsed<Button>

<Button Visibility="Collapsed">
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Style.Triggers>
                <DataTrigger Property="{Binding SomeValue}">
                    <Setter Property="Visibility" Value="Visible" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

このトリガーを機能させるには、Visibilityプロパティをスタイルトリガーよりも優先順位が低いスタイルセッターに移動します。これにより、トリガーされた値によってプロパティが上書きされます。

<Button>
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Visibility" Value="Collapsed" />
            <Style.Triggers>
                <DataTrigger Property="{Binding SomeValue}">
                    <Setter Property="Visibility" Value="Visible" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

詳細については、MSDNの依存関係プロパティの優先順位リストを参照してください。

編集

コンテンツが一度しか表示されないという2番目の問題についてはContent、スタイルに限界があるためであり、ではないためだと思いますContentTemplate

WPFはTextBlock矢印の単一のインスタンスを作成しており、コントロールは1つの親しか持てないため、スタイルが適用された後は、1つだけButtonが矢印を含めることができます。TextBlock

修正は、ContentTemplateプロパティの代わりにプロパティを使用することContentです。

<Setter Property="ContentTemplate">
    <Setter.Value>
        <DataTemplate>
            <TextBlock Text="a" Foreground="Navy" FontWeight="Bold" FontFamily="Wingdings 3" FontSize="24" Width="30"/>
        </DataTemplate>
    </Setter.Value>
</Setter>

正直なところ、それがあなたにエラーを与えなかったことに私は驚いていますSpecified element is already the logical child of another element。これは通常、この種の場合に発生することです(詳細については、こちらの投稿を参照してください)

于 2012-06-13T19:35:52.823 に答える