Соглашения об именах пространства имен XAML - PullRequest
2 голосов
/ 30 декабря 2011

У меня есть проект C # WPF с пространством имен test. Как мне назвать под-пространства имен в XAML?

<Window x:Class="test.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"      
    xmlns:local="clr-namespace:test"
    xmlns:local.c="clr-namespace:test.Converters"   
    xmlns:local.v="clr-namespace:test.Validators"       
    Title="MainWindow" Height="360" Width="640"> ....

Здесь у меня есть соглашение о разделении подпакетов с точкой .. Это нормально?

С уважением,

е.

Ответы [ 2 ]

9 голосов
/ 30 декабря 2011

Лучшая практика, если это возможно, состоит в том, чтобы отделить пространства имен C #, которые вы используете, от пространств имен WPF. Это также уменьшит количество импортируемых вами файлов. Это можно сделать благодаря классу XmlnsDefinition .

<Window x:Class="test.MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"      
  xmlns:test="http://whatever.com/test">

В AssemblyInfo.cs ваших библиотек вам просто нужно добавить:

[assembly: XmlnsDefinition("http://whatever.com/test", "test")]
[assembly: XmlnsDefinition("http://whatever.com/test", "test.Converters")]
[assembly: XmlnsDefinition("http://whatever.com/test", "test.Validators")]
[assembly: XmlnsDefinition("http://whatever.com/test", "test.CustomControls")]

Обратите внимание, что это будет работать, только если классы находятся в сборке, отличной от той, на которую вы ссылаетесь. В той же сборке вам все равно нужно будет использовать пространства имен C #.

Вы даже можете полностью исключить импорт, добавив свои пространства имен в пространство имен WPF XML:

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "test")]
[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "test.Converters")]
[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "test.Validators")]

Это позволяет людям писать:

<Window x:Class="test.MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"      
  >
  <!-- Note: no namespace prefix needed! -->
  <YourCustomControl />
1 голос
/ 30 декабря 2011

Типичное приложение WPF действительно не имеет соглашения о пространстве имен для XAML, кроме xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" по умолчанию, пространства имен времени разработки Blend и xmlns:local, которое обычно ссылается на текущее пространство имен.

В сценарии, который вы описали выше, я видел / использовал несколько вариантов, т.е.

<Window x:Class="test.MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"      
  xmlns:local="clr-namespace:test"
  xmlns:c="clr-namespace:test.Converters"   
  xmlns:v="clr-namespace:test.Validators">

или

<Window x:Class="test.MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"      
  xmlns:local="clr-namespace:test"
  xmlns:conv="clr-namespace:test.Converters"   
  xmlns:val="clr-namespace:test.Validators">

В конце концов, все зависит от того, о чем вы и ваша команда договорились.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...