C# 用本地样式替代字典样式

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" /> &

我有一个用户控件(一个modernTab,provided by),它应用了一个样式,正如在资源字典中指定的那样(同样随附)

很好,此应用程序的样式是通过app.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样式。这就是样式查找的工作方式。