0

UserControl を継承するメインの抽象コードのみのクラス BaseImpostorButton があります。xaml と分離コードを持つ子クラス ClickableImageButton があります。

ControlTemplate で次のスタイルを使用しています。

<Style TargetType="{x:Type local:ClickableImageButton}">
    <Setter Property="ToolTipService.InitialShowDelay" Value="0"/>
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:ClickableImageButton}">
                <StackPanel Margin="{TemplateBinding Margin}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" VerticalAlignment="{TemplateBinding VerticalAlignment}">
                    <ContentPresenter
                        Content="{TemplateBinding Content}"
                        ContentTemplate="{TemplateBinding ContentTemplate}" />
                </StackPanel>
            </ControlTemplate>                
        </Setter.Value>
    </Setter>
</Style>

ListView で生の ListViewItem として使用すると、ClickableImageButton が正しく表示されます。

しかし: ItemTemplate DataTemplate を使用してリストビューで使用すると、ClickableImageButton が表示されなくなります... DataTemplate 内で Content が空であるかのように。

私が見つけた解決策は、BaseImpostorButton に DependencyProperty ButtonContent を記述し、xaml で明示的に設定することでした。

しかし、誰かがこの問題を説明できますか?

編集: ここに 2 つの異なる xaml があります。基になる画像を正しく表示しているもの (ClickableImage は画像です)

<ListView Grid.Row="1" Name="ListViewSections" ItemsSource="{Binding Path=Sections}" Background="{x:Null}" SizeChanged="ListViewSections_SizeChanged">                    
            <ListViewItem>
<Grid MaxWidth="600">
                        <Grid.RowDefinitions>
                            <RowDefinition/>
                            <RowDefinition/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition MaxWidth="150"/>
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>
                        <TextBlock Grid.Row="0" Grid.ColumnSpan="2" Text="{Binding Path=Titre}" Margin="5,0,5,0" FontSize="18" FontWeight="Bold" Foreground="White" TextWrapping="Wrap" FontFamily="Arial" HorizontalAlignment="Left" />
                        <local:ClickableImageButton Grid.Row="1" Tag="{Binding Path=Id}" Grid.Column="0" ImpostorClick="Image_Click" Margin="10">
                            <local:ClickableImageButton.Content>
                                <local:ClickableImage Source="Content/tada.png" />
                            </local:ClickableImageButton.Content>
                        </local:ClickableImageButton>
                        <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Path=Texte}" Margin="10,0,10,0" FontSize="16" Foreground="White" TextWrapping="Wrap" FontFamily="Arial" VerticalAlignment="Center" HorizontalAlignment="Left" />
                    </Grid>                                       
            </ListViewItem>                
        </ListView>

そして、機能していないもの

<ListView Grid.Row="1" Name="ListViewSections" ItemsSource="{Binding Path=Sections}" Background="{x:Null}" SizeChanged="ListViewSections_SizeChanged">                    
            <ListView.ItemTemplate>
                <DataTemplate>
                    <Grid MaxWidth="600">
                        <Grid.RowDefinitions>
                            <RowDefinition/>
                            <RowDefinition/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition MaxWidth="150"/>
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>
                        <TextBlock Grid.Row="0" Grid.ColumnSpan="2" Text="{Binding Path=Titre}" Margin="5,0,5,0" FontSize="18" FontWeight="Bold" Foreground="White" TextWrapping="Wrap" FontFamily="Arial" HorizontalAlignment="Left" />
                        <local:ClickableImageButton Grid.Row="1" Tag="{Binding Path=Id}" Grid.Column="0" ImpostorClick="Image_Click" Margin="10">
                            <local:ClickableImageButton.Content>
                                <local:ClickableImage Source="Content/tada.png" />
                            </local:ClickableImageButton.Content>
                        </local:ClickableImageButton>
                        <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Path=Texte}" Margin="10,0,10,0" FontSize="16" Foreground="White" TextWrapping="Wrap" FontFamily="Arial" VerticalAlignment="Center" HorizontalAlignment="Left" />
                    </Grid>
                </DataTemplate>                    
            </ListView.ItemTemplate>                
        </ListView>
4

1 に答える 1

0

だからついに私はそれを機能させる。それは私がUserControlから派生していたという事実によるものではありませんでした。

そこで、UserControlからBaseImpostorButtonを派生させ続け、ControlTemplate(<ContentPresenter />)のContentPresenterを空にしました。

DefaultStyleKeyを設定する必要はありませんでした。

子クラスのxamlファイルからコンテンツを削除する必要がありました。実際、子UserControlを作成したときに、追加されたデフォルトのコンテンツ、つまりを削除しませんでした<Grid />。これを削除すると、私のすべての問題が解決しました。

テンプレート化されたコンテキストから設定しようとした場合、デフォルトのコンテンツはオーバーライドされないように見えますが、テンプレート化されていないコンテキストから設定された場合のみです。

つまり、以前のコード:

<sk:BaseImpostorButton x:Class="Compteur_3D.ClickableImageButton"
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
           xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
           xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  mc:Ignorable="d"
         d:DesignHeight="300" d:DesignWidth="300">
<Grid/>
</sk:BaseImpostorButton>

改訂されたコード:

<sk:BaseImpostorButton x:Class="Compteur_3D.ClickableImageButton"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"              mc:Ignorable="d"
         d:DesignHeight="300" d:DesignWidth="300">
</sk:BaseImpostorButton>

編集:実行時に、ClickableImageButton要素は、<Grid />削除されたときに適切なコンテンツ(つまり、ClickableImage)を持ちます。しかし、削除されていない場合<Grid />、ClickableImageButtonにはコンテンツとして空のグリッドがあります...<Grid />コンテンツを設定するときにこれがオーバーライドされなかったかのように:

<local:ClickableImageButton ImpostorClick="Image_Click" Margin="10">
                            <local:ClickableImageButton.Content>
                                <local:ClickableImage Source="{Binding Path=Image.Source}" />
                            </local:ClickableImageButton.Content>
                        </local:ClickableImageButton>

編集:ターゲットフレームワーク4クライアントプロファイル

于 2013-01-28T15:07:38.640 に答える