在WPF中,我如何将多个样式应用于FrameworkElement?例如,我有一个已经有风格的控件.我也有一个单独的风格,我想添加它,而不会吹掉第一个.样式有不同的TargetTypes,所以我不能只用另一个扩展一个.
我有一个数据对象用于包含支持INotifyPropertyChanged和我的UI数据IDataErrorInfo.最初我将所有UI控件都显示在一个大型WPF应用程序中,并且很高兴看到通过此自定义样式标记的错误:
<!-- Set error style for textboxes -->
<Style x:Key="txtBoxErrStyle" TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={x:Static RelativeSource.Self},
Path=(Validation.Errors)[0].ErrorContent}" />
</Trigger>
</Style.Triggers>
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel DockPanel.Dock="Right">
<AdornedElementPlaceholder />
<Image Source="Error.png"
Height="16"
Width="16"
ToolTip="{Binding Path=AdornedElement.ToolTip, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Adorner}}}" />
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
我今天正在重新组织该程序,并决定将各种UI控件分发到几页TabControl.我正在使用的结构布局是:
<tabcontrol>
<tabitem>
<AdornerDecorator>
[.. various Stack Panels, Groups and UI controls moved from original layout ..]
</AdornerDecorator>
</tabItem>
<tabitem>
<AdornerDecorator>
[.. various Stack Panels, …Run Code Online (Sandbox Code Playgroud) 我的情况如下.
我有一个App.xaml,包括ListView样式,如下所示:
<Style x:Key="{x:Type ListViewItem}" TargetType="ListViewItem">
<Setter Property="SnapsToDevicePixels" Value="true"/>
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
...
Run Code Online (Sandbox Code Playgroud)
但是,我想将一些样式添加到另一个xaml中,让我们在Window.xaml中这样说:
<ListView AlternationCount="2" Background="#FFECECEC">
<ListView.Resources>
<Style x:Key="{x:Type ListViewItem}" TargetType="{x:Type ListViewItem}">
<EventSetter Event="PreviewMouseDoubleClick" Handler="OnPreviewMouseDoubleClick" />
</Style>
</ListView.Resources>
</ListView>
Run Code Online (Sandbox Code Playgroud)
所以,我想要做的是在App.xaml中将基本设计的样式定义为默认样式.然后,添加一些修改,例如添加上下文菜单,从每个xaml添加事件.
但是,通过上面的实现,App.xaml中定义的样式将被Window.xaml中定义的样式覆盖.
有没有办法解决问题并实现它?
有没有办法在WPF中指定这样的东西:
CSS:
#someSpan input { color: #f1f1f1; }
or
span input { color: #f1f1f1; }
Run Code Online (Sandbox Code Playgroud)
意思是,我希望容器中的所有TextBlock元素都遵循x样式,而不必将样式应用于每个文本块.
为了澄清,我需要在WPF中做这样的事情.
我知道一个样式的BasedOn属性..但这不是我在这里寻找的东西
寻找这样的东西
<Style x:Key="FileItem" TargetType="{x:Type #SomeContainer TextBlock}">
Run Code Online (Sandbox Code Playgroud)
或者也许在SomeContainer中,添加将应用于其所有文本块的TextBlock样式
我已经使用了几年的资源扩展在设计时在一个新的 .Net 4 项目中停止工作,并出现以下错误:
标记扩展“StaticResourceExtension”要求在 IServiceProvider 中为 ProvideValue 实现“IXamlSchemaContextProvider”。
扩展中的相关方法如下:
public override object ProvideValue(IServiceProvider serviceProvider)
{
Style resultStyle = new Style();
foreach (string currentResourceKey in resourceKeys)
{
object key = currentResourceKey;
if (currentResourceKey == ".")
{
IProvideValueTarget service = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
key = service.TargetObject.GetType();
}
Style currentStyle = new StaticResourceExtension(key).ProvideValue(serviceProvider) as Style;
if (currentStyle == null)
throw new InvalidOperationException("Could not find style with resource key " + currentResourceKey + ".");
resultStyle.Merge(currentStyle);
}
return resultStyle;
}
Run Code Online (Sandbox Code Playgroud)
据推测,编译器给出了错误,因为当我调用时currentStyle = new StaticResourceExtension(key).ProvideValue(serviceProvider);,我传递的 …