gpt4 book ai didi

wpf - DataTemplate 内的 StaticResource 引用

转载 作者:行者123 更新时间:2023-12-03 00:21:35 25 4
gpt4 key购买 nike

从 ResourceDictionary 中定义的 DataTemplate 内部引用 StaticResources 时,我遇到了一些奇怪的行为。

在此示例中,我使用 ResourceDictionary 中定义的 DataTemplate 用数字 1 到 9 填充列表框。

这是 MainWindow.xaml 代码:

<Window x:Class="testResources.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Width="525"
Height="350">
<Grid>
<ListBox Width="100" ItemTemplate="{StaticResource NumberTemplate}">
<ListBox.ItemsSource>
<Int32Collection>1,2,3,4,5,6,7,8,9</Int32Collection>
</ListBox.ItemsSource>
</ListBox>
</Grid>

NumberTemplate 在 ResourceDictionary1.xaml 中定义:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<DataTemplate x:Key="NumberTemplate">
<Grid Background="{StaticResource CoolNumbersColor}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="35" />
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0" Background="{StaticResource CoolNumbersColor}" Text="{Binding Mode=OneWay}" />
</Grid>
</DataTemplate>

StaticResource CoolNumbersColorResourceDictionary1.xaml 一起在 App.xaml 中定义。这是我的 App.xaml 文件:

<Application x:Class="testResources.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<SolidColorBrush x:Key="CoolNumbersColor">GreenYellow</SolidColorBrush>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/ResourceDictionary1.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>

首先,我可以在 Visual Studio 2010 设计器中看到预期的行为。事实上,出现了一个彩色数字列表。但是当尝试运行此示例时,我收到错误

"Cannot find resource named 'CoolNumbersColor'. Resource names are case sensitive"

我不明白为什么会发生这种情况。 CoolNumbersColor 评估是否以某种方式推迟了?从词法上来说,它位于合并的资源字典的前面。

实现此目的的唯一方法(除了使用 DynamicResources)是创建第二个 ResourceDictionary(例如 ResourceDictionary2.xaml),在那里定义 CoolNumbersColor 并将它们全部合并到 ResourceDictionary.MergedDictionaries 中 像这样:

<Application x:Class="testResources.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/ResourceDictionary2.xaml" />
<ResourceDictionary Source="pack://application:,,,/ResourceDictionary1.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>

最佳答案

我猜这是因为:

静态资源

  • 不支持前向引用
  • 仅在程序启动时设置一次:加载时资源查找

动态资源

  • 支持前向引用
  • 适用于对资源的每次访问:运行时查找

前向引用示例

不适用于StaticResource:

<Window x:Class="SeveralResourceDictionariesHelp.MainWindow"
Background="{StaticResource testColor}" ... >

<Window.Resources>
<SolidColorBrush x:Key="testColor">Red</SolidColorBrush>
</Window.Resources>

使用DynamicResource:

<Window x:Class="SeveralResourceDictionariesHelp.MainWindow"
Background="{DynamicResource testColor}" ... >

<Window.Resources>
<SolidColorBrush x:Key="testColor">Red</SolidColorBrush>
</Window.Resources>

启动应用程序时,CoolNumbersColor(StaticResource) 在 DataTemplate 的“可见性”内不可用,它分别是抛出异常,他试图在其范围内找到它,但找不到它。

当使用资源字典时,它们分别加载到第一个队列中,在这种情况下将是资源所在的单个 View 范围。

DynamicResource 在应用程序启动时不会被加载,它将在他第一次向他发出请求时加载,并且在这个阶段 DataTemplate 它“看到”资源。

问题仍然是:为什么这个技巧在 Studio 中有效?。也许运行时加载和设计模式加载之间存在差异,但我没有在文档或其他地方找到官方确认。

关于wpf - DataTemplate 内的 StaticResource 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22245752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com