Tom*_*zzo 4 c# wpf nested-resources
从这个页面,我读到:
如果应用程序使用自定义控件并在 ResourceDictionary(或 XAML 资源节点)中定义资源,建议您在应用程序或窗口对象级别定义资源,或者在自定义控件的默认主题中定义资源。在自定义控件的 ResourceDictionary 中定义资源会对该控件的每个实例产生性能影响。
好的...现在,我有一个定义以下资源的 UserControl:
<UserControl ...>
<UserControl.Resources>
<Namespace:ImagesConverter x:Key="ImagesConverter" ...
<Storyboard x:Key="AnimationHide" ...
</UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)
因此,由于我在运行时创建不少于 100 个实例,正如 MSDN 教程所述,最好将这些资源移动到主窗口或应用程序级别。将它们转移到哪里是最佳位置?主窗口级别、应用程序级别还是资源文件?为什么?
然后...我如何从新位置使用它们?假设我的 UserControl 中有以下代码:
m_AnimationHide = (Storyboard)Resources["AnimationHide"];
Run Code Online (Sandbox Code Playgroud)
我应该如何修改它以反映这些更改?我应该如何修改以下 UserControl XAML 片段?
Source="{Binding Source={x:Static Properties:Resources.MyImage}, Converter={StaticResource ImagesConverter}}"
Run Code Online (Sandbox Code Playgroud)
就我个人而言,我更喜欢使用App.xaml或单独使用它们,ResourceDictionary而不是将它们全部添加到 中Window.Resources,这样可以消除 xaml 中的混乱Window。
这还允许您轻松地创建Themes应用程序,因为您将它们全部集中在一个位置,因此您可以复制现有的ResourceDictionary更改画笔颜色等,您可以选择ResourceDictionary要加载的内容并轻松更改应用程序的整个外观。
至于访问Resouces您的Usercontrolxaml 端没有区别,您将继续使用{StaticResource resourceKey}as 当您调用 a 时,StaticResource它会搜索Resource层次结构以查找Resource.
因此,如果您将资源从 移动UserControl.Resources到Window.Resources,或者Application.Resources您不需要更改正在访问的 xaml 代码中的任何内容{StaticResource resourceKey}。
至于后面代码中的访问,您将使用FindResource("resourceKey")而不是Resources["resourceKey"] asFindResource来搜索层次结构,就像在 xaml 中那样Resource。StaticResource
例子:
m_AnimationHide = (Storyboard)FindResource("AnimationHide");
Run Code Online (Sandbox Code Playgroud)
如果您想修改特定控件中的任何这些资源并且它们被冻结,您只需为该实例创建一个副本
例子
var animation = FindResource("AnimationHide") as Storyboard;
m_AnimationHide = animation.Clone();
m_AnimationHide.Completed += m_AnimationHide_Completed;
Run Code Online (Sandbox Code Playgroud)
您还可以设置x:Shared="false"每次从资源返回一个新的动画实例,如果您有需要更改值的复杂资源,这将节省在整个应用程序中复制/粘贴相同动画的时间。
<Storyboard x:Key="AnimationHide" x:Shared="false" />
Run Code Online (Sandbox Code Playgroud)
然后您就可以在本地修改资源。