8

所以,我正在用 C# 中的 WPF 制作一个 GUI。它看起来像这样:

现在还没有完成。这 2 行是我尝试制作一种数据表,它们在 XAML 中进行了硬编码。

现在,我正在 C# 中实现添加新水果按钮的功能。我在 XAML 中有以下样式来控制行的背景图像应该是什么样子:

<Style x:Key="stretchImage" TargetType="{x:Type Image}">
    <Setter Property="VerticalAlignment" Value="Stretch"/>
    <Setter Property="HorizontalAlignment" Value="Stretch"/>
    <Setter Property="Stretch" Value="Fill"/>
</Style>

因此,在代码中,我为每一列、 、 和 创建了一个图像col0col1如果col2我使用以下代码,

col0.Style = (Style)Application.Current.Resources["stretchImage"];
col1.Style = (Style)Application.Current.Resources["stretchImage"];
col2.Style = (Style)Application.Current.Resources["stretchImage"];

它添加了一个如下所示的新行:

如您所见,它不太正确......并且拉伸窗口会加剧问题:

它似乎不尊重样式的“拉伸”属性。

但是,如果我改为将样式加载代码更改为

col0.Style = (Style)FindResource("stretchImage");
col1.Style = (Style)FindResource("stretchImage");
col2.Style = (Style)FindResource("stretchImage");

它工作得很好:

(同样,应用程序还没有完成,所以不用担心),但我的主要问题是:Application.Current.Resources[]和之间有什么区别FindResource()?为什么一个似乎忽略了某些属性,而另一个却没有?如果可能的话,我如何Application.Current.Resources[]才能正常工作?

4

1 回答 1

16

几乎可以在可视化树中的任何元素上定义资源。FrameworkElement.FindResource() 将沿着树向上查找每个节点的资源,并最终到达 Application。Application.Current.Resources[] 跳过所有这些并直接获取应用程序上的资源。您几乎总是想使用 FindResource() 以便您可以在各个点覆盖样式。

于 2013-07-17T16:38:22.093 回答