C# 用本地样式替代字典样式
我有一个用户控件(一个modernTab,provided by),它应用了一个样式,正如在资源字典中指定的那样(同样随附) 很好,此应用程序的样式是通过app.xaml文件中的一些默认资源提供的,如下所示:C# 用本地样式替代字典样式,c#,wpf,xaml,modern-ui,C#,Wpf,Xaml,Modern Ui,我有一个用户控件(一个modernTab,provided by),它应用了一个样式,正如在资源字典中指定的那样(同样随附) 很好,此应用程序的样式是通过app.xaml文件中的一些默认资源提供的,如下所示: <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="/FirstFloor.ModernUI;component/Assets/ModernUI.xaml" /> &
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/FirstFloor.ModernUI;component/Assets/ModernUI.xaml" />
<ResourceDictionary Source="/FirstFloor.ModernUI;component/Assets/ModernUI.Light.xaml"/>
</ResourceDictionary.MergedDictionaries>
<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>
<mui:ModernTab Style={StaticResource MyAwesomeStyle} .../>
那很好。但是,我希望覆盖我为modernTab的特定实例使用的链接样式。所以在我的XAML中,我尝试这样做:
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/FirstFloor.ModernUI;component/Assets/ModernUI.xaml" />
<ResourceDictionary Source="/FirstFloor.ModernUI;component/Assets/ModernUI.Light.xaml"/>
</ResourceDictionary.MergedDictionaries>
<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>
<mui:ModernTab Style={StaticResource MyAwesomeStyle} .../>
现在,通过查看源代码,我知道在modernTab控件的内部有一堆ListBoxItems,这就是我想要更改的样式
我不明白的是,为什么我的“本地”风格没有在这个特定实例中下降和覆盖。有什么想法吗
我试着在App.xaml中定义我的样式覆盖(尽管我并不真的希望它是全局的),但它不起作用。显然,我遗漏了一些东西。您在这里所做的不是覆盖ModernTab的默认样式,而是指定特定实例的资源,该样式仍然取自 这里需要做的是为ModernTab实例指定内联样式:
<mui:ModernTab ...>
<mui:ModernTab.Style>
<Style TargetType="mui:ModernTab">
<!------- Full ModernTab Style ----->
</Style>
</mui:ModernTab.Style>
希望这对您有所帮助您在这里所做的不是覆盖ModernTab的默认样式,而是指定特定实例的资源,该样式仍然取自 这里需要做的是为ModernTab实例指定内联样式:
<mui:ModernTab ...>
<mui:ModernTab.Style>
<Style TargetType="mui:ModernTab">
<!------- Full ModernTab Style ----->
</Style>
</mui:ModernTab.Style>
希望这有帮助您需要在ModernTab中“覆盖”列表框的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中“覆盖”列表框的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>
使用BasedOn=“{StaticResource{x:Type mui:ModernTab}”,可以基于默认的ModernTab样式创建样式。在资源字典中声明隐式样式(不带x:Key)时,WPF会自动使用该样式的TargetType作为键。@Pavel Awesome!我知道隐式键的内容,但我不知道可以使用隐式键引用样式。其实很有道理,谢谢@帕维尔:对吗?我有这样一个声明:intellisense告诉我没有找到资源“”?此外,它似乎几乎没有任何效果。可以使用BasedOn=“{StaticResource{x:Type mui:ModernTab}}”,基于默认的ModernTab样式创建样式。在资源字典中声明隐式样式(不带x:Key)时,WPF会自动使用该样式的TargetType作为键。@Pavel Awesome!我知道隐式键的内容,但我不知道可以使用隐式键引用样式。其实很有道理,谢谢@帕维尔:对吗?我有这样一个声明:intellisense告诉我没有找到资源“”?而且,它似乎几乎没有任何效果。在mui:ModernTab
的ControlTemplate
中,设置了一个。我认为这优先于隐式的ListBoxItem
样式。整个构造在我看来不是很灵活,所以在尝试替换该样式之前请三思……在mui:ModernTab
的ControlTemplate
中,设置了一个。我认为这优先于隐式的ListBoxItem
样式。整个构造在我看来不是很灵活,所以在尝试替换该样式之前请三思……好的,是的,这确实有效!我不明白为什么!为什么我必须指定listbox,然后沿着树向下设置ListBoxItem样式?为什么我不能直接设置ListBoxItem样式?因为ModernTab的默认ControlTemplate中的ListBox为ListBox设置了ItemContainerStyle,这意味着此样式将优先于并应用于指定为ModernTab资源的隐式ListBoxItem样式。这就是样式查找的工作方式。好的,是的,确实有效!我不明白为什么!为什么我必须指定listbox,然后沿着树向下设置ListBoxItem样式?为什么我不能直接设置ListBoxItem样式?因为ModernTab的默认ControlTemplate中的ListBox为ListBox设置了ItemContainerStyle,这意味着此样式将优先于并应用于指定为ModernTab资源的隐式ListBoxItem样式。这就是样式查找的工作方式。