You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

能否创建共享XAML命名空间?统一复用命名空间需求问询

好问题!我太懂你这种每次新建UserControl都要复制粘贴一堆命名空间,还被自动补全乱改别名的烦躁了。咱们来聊聊可行的解决办法,还有你想的那个DynamicResource路子为啥走不通:

可行的解决方案

1. 自定义Visual Studio代码片段(最推荐)

这是最灵活高效的方式,你可以把常用的命名空间集合做成一个代码片段,需要时一键插入:

  • 打开Visual Studio,点击「工具」→「代码片段管理器」
  • 选择「XAML」类别,点击「导入」按钮
  • 新建一个后缀为.snippet的文件,内容参考下面的模板(可以根据你的需求修改命名空间和别名):
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>Custom UserControl with Predefined Namespaces</Title>
      <Shortcut>myuc</Shortcut>
      <Description>快速生成带固定命名空间的UserControl模板</Description>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Declarations>
        <Literal>
          <ID>ClassName</ID>
          <ToolTip>UserControl的类名</ToolTip>
          <Default>MyPageView</Default>
        </Literal>
        <Literal>
          <ID>Namespace</ID>
          <ToolTip>UserControl所在的命名空间</ToolTip>
          <Default>myNamespace.Views</Default>
        </Literal>
      </Declarations>
      <Code Language="xml">
        <![CDATA[<UserControl x:Class="$Namespace$.$ClassName$"
             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:mvvm="http://prismlibrary.com/"
             xmlns:controls="clr-namespace:MyNamespace.Controls.Views;assembly=MyNamespace.Controls"
             mvvm:ViewModelLocator.AutoWireViewModel="true"
             AutomationProperties.AutomationId="{Binding PageName}"
             mc:Ignorable="d"
             HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
             d:DesignHeight="618" d:DesignWidth="1024">
    <Grid>
        
    </Grid>
</UserControl>]]>
      </Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>
  • 导入完成后,在XAML文件里输入你设置的快捷词(比如myuc),按Tab键就能自动生成带所有预设命名空间的UserControl,别名完全统一,再也不怕自动补全乱改了。

2. 自定义项目/项模板

如果希望新建的所有UserControl默认就带这些命名空间,可以自定义项模板:

  • 先创建一个符合要求的UserControl示例文件,把命名空间和属性都配置好
  • 点击「项目」→「导出模板」,选择「项模板」,跟着向导完成导出
  • 以后新建UserControl时,直接选择你自定义的模板,就能自动生成符合要求的代码。

3. 修改Visual Studio默认模板(进阶操作)

你也可以直接修改VS自带的UserControl模板,一劳永逸:

  • 找到VS的安装目录,比如C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\ItemTemplates\CSharp\WPF\1033\UserControl
  • 打开UserControl.xaml文件,把你的常用命名空间和属性加进去,保存后重启VS,以后新建UserControl就会自动带上这些内容。
关于你提到的DynamicResource方式:不可行

很遗憾,你设想的<UserControl something="{DynamicResource DefaultControlSetup}">这种方式是行不通的。因为XAML的命名空间声明是编译阶段就必须解析完成的,属于XAML解析的第一步;而DynamicResource运行时才会去查找的资源,这时候XAML已经完成了解析,根本没办法通过资源来复用命名空间声明。

总结下来,用代码片段或者自定义模板是最靠谱的方案,既能统一别名,又能省去重复输入的麻烦。

内容的提问来源于stack exchange,提问作者user3265613

火山引擎 最新活动