- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试正确设置我的样式。因此,我创建了一个外部 ResourceDictionary
对于所有常见的样式属性,我在其中定义了一个默认字体系列,如下所示:
<FontFamily x:Key="Default.FontFamily">Impact</FontFamily>
<StaticResource x:Key="GroupBox.HeaderFontFamily" ResourceKey="Default.FontFamily"/>
TextBlock
上使用它包含在我的组框模板中。
<Style x:Key="GroupBoxHeaderTextStyle" TargetType="{x:Type TextBlock}">
<Setter Property="FontFamily" Value="{StaticResource GroupBox.HeaderFontFamily}"/>
</Style>
<StaticResource x:Key="GroupBox.HeaderFontFamily" ResourceKey="Default.FontFamily"/>
<StaticResource x:Key="FormLabel.FontFamily" ResourceKey="Default.FontFamily"/>
Exception: Cannot find resource named 'Hsetu.GroupBox.HeaderFontFamily'. Resource names are case sensitive.
StaticResource
时,无法找到直接寻址的元素。 (是的,这也适用于 StaticResources 以外的元素。例如,如果我尝试直接处理字体系列
"Default.FontFamily"
,我会得到相同的错误,因为它位于
StaticResource
元素之前)
DynamicResource
正如第二个示例中所建议的,我提供了上面的链接:
<DynamicResource x:Key="GroupBox.HeaderFontFamily" ResourceKey="Default.FontFamily"/>
<DynamicResource x:Key="FormLabel.FontFamily" ResourceKey="Default.FontFamily"/>
<Style x:Key="GroupBoxHeaderTextStyle" TargetType="{x:Type TextBlock}">
<Setter Property="FontFamily" Value="{StaticResource GroupBox.HeaderFontFamily}"/>
</Style>
ArgumentException: 'System.Windows.ResourceReferenceExpression' is not a valid value for property 'FontFamily'.
DynamicResource
在我的组框样式中只更改了错误消息:
<DynamicResource x:Key="GroupBox.HeaderFontFamily" ResourceKey="Default.FontFamily"/>
<DynamicResource x:Key="FormLabel.FontFamily" ResourceKey="Default.FontFamily"/>
<Style x:Key="GroupBoxHeaderTextStyle" TargetType="{x:Type TextBlock}">
<Setter Property="FontFamily" Value="{DynamicResource GroupBox.HeaderFontFamily}"/>
</Style>
System.InvalidCastException: 'Unable to cast object of type 'System.Windows.ResourceReferenceExpression' to type 'System.Windows.Media.FontFamily'.'
StaticResource
紧随其后的是另一个,我想在资源之间包含一个虚拟元素。
<StaticResource x:Key="GroupBox.HeaderFontFamily" ResourceKey="Default.FontFamily"/>
<Separator x:Key="Dummy"/>
<StaticResource x:Key="FormLabel.FontFamily" ResourceKey="Default.FontFamily"/>
"FormLabel.FontFamily"
<Style x:Key="FormLabelStyle" TargetType="{x:Type Label}">
<Setter Property="FontFamily" Value="{StaticResource FormLabel.FontFamily}"/>
</Style>
System.InvalidCastException: 'Unable to cast object of type 'System.Windows.Controls.Separator' to type 'System.Windows.Media.FontFamily'.'
Separator
怎么回事?我假设,在处理 StaticResource 时,WPF 实际上会尝试使用前面的元素——它只在开始时起作用,因为前面的元素是
FontFamily
偶然 - 而不是
ResourceKey
引用的元素.同时,使前面的元素无法直接访问。为了证实我的怀疑,我替换了
Separator
与另一个
FontFamily
.
<StaticResource x:Key="GroupBox.HeaderFontFamily" ResourceKey="Default.FontFamily"/>
<FontFamily x:Key="Dummy">Courier New</FontFamily>
<StaticResource x:Key="FormLabel.FontFamily" ResourceKey="Default.FontFamily"/>
FontSize
、
BorderThickness
、
FontWeight
等)中。那么,这实际上是 WPF 中的错误还是
StaticResource
s 应该这样做(这对我来说没有任何意义)?我怎样才能在多个地方使用我的字体系列,只定义一次?
最佳答案
不确定奇数引用发生了什么,但如果您使用 DynamicResource
为资源设置别名您必须使用 StaticResource
进行查找.也许有一种方法可以使引用另一个动态资源的动态资源解析为原始值(例如,使用自定义标记扩展),但这不是默认情况下发生的。
<Grid>
<Grid.Resources>
<FontFamily x:Key="Default.FontFamily">Impact</FontFamily>
<DynamicResource x:Key="FormLabel.FontFamily" ResourceKey="Default.FontFamily"/>
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" FontFamily="{StaticResource FormLabel.FontFamily}">Test</Label>
<TextBox Grid.Column="1"/>
</Grid>
MultiBinding
的自定义标记扩展。在内部获取对绑定(bind)元素的引用,然后解析其上的资源。
<FontFamily x:Key="Default.FontFamily">Impact</FontFamily>
<DynamicResource x:Key="FormLabel.FontFamily" ResourceKey="Default.FontFamily"/>
<Style TargetType="{x:Type Label}">
<Setter Property="FontFamily" Value="{local:CascadingDynamicResource FormLabel.FontFamily}"/>
</Style>
public class CascadingDynamicResourceExtension : MarkupExtension
{
public object ResourceKey { get; set; }
public CascadingDynamicResourceExtension() { }
public CascadingDynamicResourceExtension(object resourceKey)
{
ResourceKey = resourceKey;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
var binding = new MultiBinding { Converter = new CascadingDynamicResourceResolver() };
binding.Bindings.Add(new Binding { RelativeSource = new RelativeSource(RelativeSourceMode.Self) });
binding.Bindings.Add(new Binding { Source = ResourceKey });
return binding;
}
}
internal class CascadingDynamicResourceResolver : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var target = (FrameworkElement)values[0];
var resourceKey = values[1];
var converter = new ResourceReferenceExpressionConverter();
object value = target.FindResource(resourceKey);
while (true)
{
try
{
var dynamicResource = (DynamicResourceExtension)converter.ConvertTo(value, typeof(MarkupExtension));
value = target.FindResource(dynamicResource.ResourceKey);
}
catch (Exception)
{
return value;
}
}
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
try
/
catch
存在是因为
ResourceReferenceExpressionConverter
没有正确实现
CanConvertFrom
不幸的是
ResourceReferenceExpression
是内部的,所以这可能仍然是最干净的方法。它仍然假设一些内部结构,例如转换为
MarkupExtension
, 尽管。
<FontFamily x:Key="Default.FontFamily">Impact</FontFamily>
<DynamicResource x:Key="FormLabel.FontFamily" ResourceKey="Default.FontFamily"/>
<DynamicResource x:Key="My.FontFamily" ResourceKey="FormLabel.FontFamily"/>
<Style TargetType="{x:Type Label}">
<Setter Property="FontFamily" Value="{local:CascadingDynamicResource My.FontFamily}"/>
</Style>
关于wpf - 在另一个 StaticResource 中引用一个 StaticResource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51968177/
我正在尝试正确设置我的样式。因此,我创建了一个外部 ResourceDictionary对于所有常见的样式属性,我在其中定义了一个默认字体系列,如下所示: Impact 这样,当我更改这一行时,家庭会
我在 App.Resources 中创建了一个 mycustomItemsPanel .... Some code here 并以这种方式将其提供给 UICon
我有一个异常(exception) “找不到名为‘mrg’的资源。资源名称区分大小写。” 当我尝试执行以下操作时: 主窗口.xaml:
我的 Window.Resources 中有以下 StaticResource 我在窗口内有一个用户控件。我需要在我的用户控件中引用上述资源,我该怎么做?我无法将资源移动到单独的字典文件。 上面给
我的 Window.Resources 中有以下 StaticResource 我在窗口内有一个用户控件。我需要在我的用户控件中引用上述资源,我该怎么做?我无法将资源移动到单独的字典文件。 上面给
基本上,我想将所有 XAML 资源保存在外部程序集中(用于我的样式)。我在我的应用程序中引用了这个外部程序集。 是否与附属程序集或诸如此类的东西有关,或者我该如何访问这些样式,以便我的应用程序仍然可以
当我尝试执行以下操作时,“找不到名为‘mrg’的资源。资源名称区分大小写。”出现异常: 主窗口.xaml:
我想在 sytacklayout 中使用特定的 Padding 构建几个页面。我不想把它写在每一页上。考虑到我将来是否要更改它,它的设计并不是很好。有没有办法在静态资源中定义填充?这样我就可以在一个地
我正在将 Telerik 的 RadControls 用于带有隐式样式的 WPF。以下样式定义于 Themes/Windows8/Telerik.Windows.Controls.RibbonView
在 XAML 中,我这样做: 我如何在代码隐藏中做同样的事情? 最佳答案 页面级资源对象能够查找本地、应用级、静态和主题资源。这意味着您只需执行以下操作: foo2.Style = this.Res
我有两个文本框,它们使用相同的 StaticResource 作为前景色。 当我应用更改第一个 TextBox 颜色的动画时,第二个 TextBox 上的颜色也会更改。 如果我不使用 StaticRe
比方说,我有这样的东西(在 MainPage.xaml 中): 然后,我想将该 StaticResource 样式应用于我动态创建的 Tex
我想在 xaml 文档的根元素中使用 StaticResource。 但 MSDN 说: Static resource references from within a resource dicti
从 ResourceDictionary 中定义的 DataTemplate 内部引用 StaticResources 时,我遇到了一些奇怪的行为。 在此示例中,我使用 ResourceDiction
在从 .net 3.5 升级到 .net 4 的过程中,我是否遗漏了一些东西,因为我看到了似乎与系统目标背道而驰的错误行为。 我正在尝试使用一些示例来构建一个简单的 MVVM 库以用于工作。我在 Tw
我在 App.xaml 的 ResourceDictionary 中有一个字符串。 .Images.logoEvo.png 我怎样才能像这样在另一个 StaticResource 中使用它: Ima
请帮助我如何创建一个 MarkupExtension 看起来像 wpf 的 StaticResource,我有: 我自己的类(class): public class Item{ public str
当我尝试从代码隐藏列表中绑定(bind)静态资源的名称时,我遇到了一个大问题。 public IDictionary Categories = new Dictionary(); Categories
我正在编写 XAML/WPF,有时使用对象元素语法来引用静态资源: 这似乎与 StaticResource Markup Extension docs 一致在某些情况下,这是我所知道的唯一选择,例如
给出下面的“部分”xaml: 我的转换器类“StatusTypeNameToBrushConverter.cs”
我是一名优秀的程序员,十分优秀!