(wpf)Application.Current.Resources vs FindResource

时间:2013-07-17 16:11:40

标签: c# wpf styles

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

现在还没有完成。这两行是我尝试制作一种数据表,它们在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>

因此,在代码中,我为每列col0col1col2创建了一个图片,如果我使用以下代码,

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

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

正如你所看到的,它不太正确...... 拉伸窗户会加剧问题:

似乎不尊重风格的“Stretch”属性。

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

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

效果很好:

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

1 个答案:

答案 0 :(得分:13)

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