我可以使用在自己的XXX.Resources中声明的资源吗?

时间:2018-04-19 08:45:26

标签: wpf xaml

我有一个窗口,我在其中声明了一个资源,我正在跳跃以便能够在窗口中使用它,但我不确定这是可能的吗?

<dx:ThemedWindow x:Class="SomeWindow"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:dxco="http://schemas.devexpress.com/winfx/2008/xaml/controls"
             xmlns:dxmvvm="http://schemas.devexpress.com/winfx/2008/xaml/mvvm"
             xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
             xmlns:frameworkExtensions="clr-namespace:SomeNamespace.FrameworkExtensions"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800"  ContentTemplate="{StaticResource dataTemplate}" >
    <dx:ThemedWindow.Resources>
        <frameworkExtensions:ConventionBasedDataTemplateSelector x:Key="dataTemplate"/>
    </dx:ThemedWindow.Resources>
[...]
</dx:ThemedWindow>

这里的示例是自定义DataTemplate。

我该怎么做?因为目前Visual Studio警告我它找不到“dataTemplate”

2 个答案:

答案 0 :(得分:1)

资源的工作方式是控件在自己中查找资源,然后在父级中查找可视树中的所有资源,直到它到达应用程序。 see here

所以如果你在listview上声明了资源,那么它所包含的面板就不能使用资源,但是列表视图可以。

我怀疑您遇到的问题是该模板尚未存在,因为您尚未编译代码。因为wpf是如此灵活,设计者实际上必须运行代码以查看它是如何工作的,所以如果你的代码自上次编译后还没有编译或更改,设计师就看不到这些变化。

失败,它可能只是执行的顺序,即您在属性中使用模板但在子元素中创建它,在这种情况下,将contentTemplate移动到resources元素下面的元素,您应该有权访问它。

<dx:ThemedWindow.Resources>
    <frameworkExtensions:ConventionBasedDataTemplateSelector x:Key="dataTemplate"/>
</dx:ThemedWindow.Resources>
<dx:ThemedWindow.ContentTemplate>
   <StaticResource ResourceKey="dataTemplate"/>
</dx:ThemedWindow.ContentTemplate>

答案 1 :(得分:1)

您的问题是因为您尝试在资源出现之前使用资源。 让我们考虑一个简单的例子。 如果你这样做了:

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="200" Width="400"

        >
    <Window.Resources>
        <SolidColorBrush x:Key="TestResourceBrush" Color="Blue"/>
    </Window.Resources>
    <Window.Background>
        <StaticResource ResourceKey="TestResourceBrush"/>
    </Window.Background>
    <Grid>

    </Grid>
</Window>

然后你看到没有错误,窗口的背景变成蓝色。

如果您改为:

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="200" Width="400"
        Background="{StaticResource TestResourceBrush}"
        >
    <Window.Resources>
        <SolidColorBrush x:Key="TestResourceBrush" Color="Blue"/>
    </Window.Resources>

    <Grid>

    </Grid>
</Window>

然后那会出错,说它无法解析资源。

如果你制作了一个DynamicResource,那就行了。

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="200" Width="400"
        Background="{DynamicResource TestResourceBrush}"
        >
    <Window.Resources>
        <SolidColorBrush x:Key="TestResourceBrush" Color="Blue"/>
    </Window.Resources>
    <Grid>
    </Grid>
</Window>