WPF BasedOn 在运行时为空,但在设计器中工作

问题描述 投票:0回答:1

我有一个名为 Heading 的自定义 WPF 控件,我使用 Theme.xaml 在应用程序范围内设置该控件的样式,并在其中设置了 ControlTemplate。我正在使用 BasedOn 为某些窗口调整此样式。这在设计器中有效,但在运行时失败。结果是一个不可见的控件,因为它没有控件模板。

此项目中的多个自定义控件都会发生这种情况。这些控件在其他项目中运行良好。

Theme.xaml中的样式:

 <Style TargetType="{x:Type controls3:Heading}">
     <Setter Property="Focusable" Value="False" />
     <Setter Property="Template">
         <Setter.Value>
             <ControlTemplate TargetType="{x:Type controls3:Heading}">
                 <StackPanel>
                     <Grid>
                         <Grid.ColumnDefinitions>
                             <ColumnDefinition Width="*" />
                             <ColumnDefinition Width="Auto" />
                             <ColumnDefinition Width="Auto" />
                         </Grid.ColumnDefinitions>

                         <TextBlock Grid.Column="0"
                                    Text="{TemplateBinding Text}"
                                    FontWeight="Bold" 
                                    FontSize="12" LineHeight="12"
                                    VerticalAlignment="Center"
                                    LineStackingStrategy="BlockLineHeight"
                                    Foreground="{StaticResource SolidWorksTextGrayBrush}"/>

                         <Button Grid.Column="1" 
                                 ToolTip="{TemplateBinding Button1Tooltip}"
                                 Width="25" Height="25" 
                                 VerticalAlignment="Center"
                                 Margin="10 0 0 0"
                                 Command="{TemplateBinding Button1Command}"
                                 Visibility="{TemplateBinding ShowButton1, Converter={StaticResource BooleanToVisibilityConverter}}"
                                 Focusable="False">
                             <Image Source="{TemplateBinding Button1ImageSource}"
                                    Width="{TemplateBinding Button1ImageWidth}"/>
                         </Button>
                         <Button Grid.Column="2" 
                                 ToolTip="{TemplateBinding Button2Tooltip}"
                                 Width="25" Height="25" 
                                 VerticalAlignment="Center"
                                 Margin="10 0 0 0"
                                 Command="{TemplateBinding Button2Command}"
                                 Visibility="{TemplateBinding ShowButton2, Converter={StaticResource BooleanToVisibilityConverter}}"
                                 Focusable="False">
                             <Image Source="{TemplateBinding Button2ImageSource}"
                                    Width="{TemplateBinding Button2ImageWidth}"/>
                         </Button>
                     </Grid>
                 </StackPanel>
             </ControlTemplate>
         </Setter.Value>
     </Setter>
 </Style>

窗口中的样式:

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/ProjectName.Addin;component/Windows/Theme.xaml" />
        </ResourceDictionary.MergedDictionaries>
        <Style TargetType="controls:Heading" BasedOn="{StaticResource {x:Type controls:Heading}}">
            <Setter Property="Margin" Value="5 10 0 5" />
        </Style>
    </ResourceDictionary>
</Window.Resources>

我做了很多调试并注意到:

  1. 当我在代码隐藏中设置断点时,即使我设置了此属性,BasedOn 属性仍为 null。
  2. 当我给它一个键并在每次创建标题时添加该键时,该样式就会起作用。
  3. 当我注释+取消注释并且启用热重载时,该样式有效。所以感觉第一次设置 BasedOn 时样式不存在。
  4. 当我在代码隐藏中的代码中创建样式时,该样式起作用。
  5. 我使用多种样式和自定义控件,这个项目比所有其他项目有更多的问题。所以这感觉像是一个项目范围的问题,但我找不到项目之间的区别。

知道这里可能出了什么问题吗?

c# wpf
1个回答
0
投票

尝试重写自定义控件构造函数中的defaultstylekey,如下所示:

public class Heading
{
    static Heading()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(Heading),
            new FrameworkPropertyMetadata(typeof(Heading)));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.