0

我有一个主要的抽象代码类 BaseImpostorButton,继承了 UserControl。我有一个带有 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 内时内容为空一样。

我找到的解决方案是在 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>

<Grid />编辑:在运行时,我的 ClickableImageButton 元素在删除时具有正确的内容(即 ClickableImage) 。但是当<Grid />没有被删除时,我的 ClickableImageButton 有空的 Grid 作为内容......好像<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 回答