用本地风格覆盖字典风格
Override dictionary style with local style
我有一个用户控件(一个 modernTab,由 modernui) that has a style applied to it, as is specified in a resource dictionary (that again came with modernui 提供)。
很好,此应用的样式是通过 App.xaml 文件中的一些默认资源提供的,如下所示:
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/FirstFloor.ModernUI;component/Assets/ModernUI.xaml" />
<ResourceDictionary Source="/FirstFloor.ModernUI;component/Assets/ModernUI.Light.xaml"/>
</ResourceDictionary.MergedDictionaries>
很好,很好。但是,我想覆盖我用于 modernTab 的特定实例的 link 样式。所以在我的 XAML 中,我尝试这样做:
<mui:ModernTab ListWidth="Auto"
Layout="List"
Links ="{Binding MyViewModelLinks}">
<mui:ModernTab.Resources>
<Style TargetType="ListBoxItem">
<Setter Property="Foreground" Value="Black" />
<Setter Property="Background" Value="Yellow" />
</Style>
</mui:ModernTab.Resources>
</mui:ModernTab>
现在,我通过查看源代码了解到,在 modernTab 控件的内部,它有一堆 ListBoxItems - 这些是我想要更改其样式的内容。
我不明白的是为什么我的 "local" 风格没有下降并覆盖这个特定实例。有任何想法吗?
我尝试在 App.xaml 中定义我的样式覆盖(即使我真的不希望它是全局的)但它没有用。显然我错过了一些东西。
你在这里做的不是覆盖 ModernTab 的默认样式,而是指定特定实例的资源,样式仍然取自 ModernTab.xaml
您在这里需要做的是为您的 ModernTab 实例指定内联样式:
<mui:ModernTab ...>
<mui:ModernTab.Style>
<Style TargetType="mui:ModernTab">
<!------- Full ModernTab Style ----->
</Style>
</mui:ModernTab.Style>
此内联样式将覆盖默认样式。坏消息是您不能基于默认的 ModernTab 样式创建样式,只能调整小细节,因为默认样式没有名称 (x:Key
)。但是您可以复制整个样式,更改其中的任何内容,然后改用它。您可能应该将它放在一个资源文件中,然后像这样在您的 ModernTab 实例上使用它:
<mui:ModernTab Style={StaticResource MyAwesomeStyle} .../>
希望对您有所帮助
您需要 "override" 现代选项卡中列表框的 ItemContainerStyle。这应该可以解决问题:
<mui:ModernTab ListWidth="Auto"
Layout="List"
Links ="{Binding MyViewModelLinks}">
<mui:ModernTab.Resources>
<Style TargetType="ListBox">
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="ListBoxItem">
<Setter Property="Foreground" Value="Black" />
<Setter Property="Background" Value="Yellow" />
</Style>
</Setter.Value>
</Setter>
</Style>
</mui:ModernTab.Resources>
</mui:ModernTab>
我有一个用户控件(一个 modernTab,由 modernui) that has a style applied to it, as is specified in a resource dictionary (that again came with modernui 提供)。
很好,此应用的样式是通过 App.xaml 文件中的一些默认资源提供的,如下所示:
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/FirstFloor.ModernUI;component/Assets/ModernUI.xaml" />
<ResourceDictionary Source="/FirstFloor.ModernUI;component/Assets/ModernUI.Light.xaml"/>
</ResourceDictionary.MergedDictionaries>
很好,很好。但是,我想覆盖我用于 modernTab 的特定实例的 link 样式。所以在我的 XAML 中,我尝试这样做:
<mui:ModernTab ListWidth="Auto"
Layout="List"
Links ="{Binding MyViewModelLinks}">
<mui:ModernTab.Resources>
<Style TargetType="ListBoxItem">
<Setter Property="Foreground" Value="Black" />
<Setter Property="Background" Value="Yellow" />
</Style>
</mui:ModernTab.Resources>
</mui:ModernTab>
现在,我通过查看源代码了解到,在 modernTab 控件的内部,它有一堆 ListBoxItems - 这些是我想要更改其样式的内容。
我不明白的是为什么我的 "local" 风格没有下降并覆盖这个特定实例。有任何想法吗?
我尝试在 App.xaml 中定义我的样式覆盖(即使我真的不希望它是全局的)但它没有用。显然我错过了一些东西。
你在这里做的不是覆盖 ModernTab 的默认样式,而是指定特定实例的资源,样式仍然取自 ModernTab.xaml
您在这里需要做的是为您的 ModernTab 实例指定内联样式:
<mui:ModernTab ...>
<mui:ModernTab.Style>
<Style TargetType="mui:ModernTab">
<!------- Full ModernTab Style ----->
</Style>
</mui:ModernTab.Style>
此内联样式将覆盖默认样式。坏消息是您不能基于默认的 ModernTab 样式创建样式,只能调整小细节,因为默认样式没有名称 (x:Key
)。但是您可以复制整个样式,更改其中的任何内容,然后改用它。您可能应该将它放在一个资源文件中,然后像这样在您的 ModernTab 实例上使用它:
<mui:ModernTab Style={StaticResource MyAwesomeStyle} .../>
希望对您有所帮助
您需要 "override" 现代选项卡中列表框的 ItemContainerStyle。这应该可以解决问题:
<mui:ModernTab ListWidth="Auto"
Layout="List"
Links ="{Binding MyViewModelLinks}">
<mui:ModernTab.Resources>
<Style TargetType="ListBox">
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="ListBoxItem">
<Setter Property="Foreground" Value="Black" />
<Setter Property="Background" Value="Yellow" />
</Style>
</Setter.Value>
</Setter>
</Style>
</mui:ModernTab.Resources>
</mui:ModernTab>