我创建了一个类库程序集,我在其中创建了自定义控件,并在generic.xaml文件中定义了默认样式.
这似乎是一个相当普遍的问题,只要有很多人发布它.但是我找不到任何有用的答案.
在我的测试应用程序中,如果我手动将我的自定义控件程序集中的generic.xaml文件合并到应用程序App.xaml文件中,如下所示:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/MyControlsAssembly;component/Themes/generic.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)
然后自定义控件正确主题,但如果我不手动合并generic.xaml,控件将显示默认的Windows主题.
你能告诉我我忘记和/或做错了什么吗?
附加信息:
我的ThemeInfo程序集属性定义如下:
[assembly: ThemeInfo(ResourceDictionaryLocation.SourceAssembly, ResourceDictionaryLocation.SourceAssembly)]
(注意:结果与ThemeInfo属性的任何参数组合相同)
Themes文件夹中的generic.xaml文件旁边还有另外两个.xaml文件.
我认为,当msbuild即将编译源代码文件,它产生的文件来构建,基于名单Include和Exclude项目的规则.
有没有办法在评估要编译的文件列表之前执行任务?
这是为了能够生成源代码文件并使其在构建中获取.
我正在制作一个.NET Core CLI工具,必须在使用它的项目构建之前运行,因为它(CLI工具)生成一个必须包含在构建中的文件.
该项目是使用新.csproj系统创建的,而不是旧系统project.json.
与我的.NET Core CLI工具项目一起,我创建了一个用于测试目的的库项目.
如果我.csproj在测试库中添加它:
<ItemGroup>
<DotNetCliToolReference Include="MyCliTool" Version="x.x.x" />
<!-- here x.x.x is just a placeholder -->
</ItemGroup>
<Target Name="MyCliToolTarget" AfterTargets="Restore" BeforeTargets="BeforeBuild">
<Exec Command="dotnet my-cli-tool" />
</Target>
Run Code Online (Sandbox Code Playgroud)
然后,如果之前不存在,则不会在编译中考虑CLI工具生成的文件.这意味着当文件存在时,它可以,但这也意味着第一次构建(克隆,清理或什么之后)总是会失败.
我尝试了几个不同的目标,BeforeTargets但我找不到让它工作的方法.我试图InitialTargets在Project节点中设置我的目标,但它也不起作用.我试图Outputs将Target节点的属性设置为CLI工具生成的文件名,但同样,它失败了.
我发现唯一有效的解决方案是手动添加Compile指令,如下所示:
<ItemGroup>
<Compile Include="MyGeneratedFile.cs" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
此解决方案暂时没问题,但文件名可能会根据CLI工具选项而改变,这会使两个地方的文件名必须在更改时更新,如下所示:
<ItemGroup>
<Compile Include="PATH\TO\CUSTOM_FILENAME_HERE.CS" />
<DotNetCliToolReference Include="MyCliTool" Version="x.x.x" />
</ItemGroup>
<Target Name="MyCliToolTarget" …Run Code Online (Sandbox Code Playgroud)