Что означает значение x: Name в xaml (WPF) и его использование с раскадровкой - PullRequest
5 голосов
/ 26 октября 2010
<Border Name="ItemBorder" Margin="5 5 0 5" BorderBrush="Black" BorderThickness="1" Height="75" Width="75">
  <Border.Background>
    <SolidColorBrush x:Name="ItemBorderBrush" Color="LightBlue"/>
  </Border.Background>
  <ContentPresenter/>
</Border>
<ControlTemplate.Triggers>
  <EventTrigger RoutedEvent="someEvent">
    <BeginStoryboard>
      <Storyboard TargetName="ItemBorderBrush" TargetProperty="Color" Duration="0:0:1" >
      <!--Storyboard TargetName="ItemBorder" TargetProperty="Background.Color" Duration="0:0:1"> -->
         <ColorAnimation To="White"/>
      </Storyboard>
    </BeginStoryboard>
  </EventTrigger>
</ControlTemplate.Triggers>

Я постараюсь четко объяснить свой вопрос.Имя Storyboard Target, когда это «ItemBorder» (закомментированная строка), работает с перебоями.Иногда я получаю сообщение об ошибке, что имя «ItemBorder» не может быть найдено в области видимости.

Я решил следовать стилю из этого примера MSDN и изменить свойство цвета непосредственно на кисти, вместо того, чтобыцелью раскадровки будет граница и изменение цвета кисти границы по свойству (закомментированная строка).Это похоже на работу.

Тем не менее, Name="ItemBorderBrush" не компилируется, поскольку Name не является свойством SolidColorBrush, поэтому я использую x:Name="ItemBorderBrush" И Name, и x:Name принимаются для границыПочему это так?

Что означает x: (чем x:Name отличается от Name), и почему свойство Name border может иногда работать только с раскадровкой?

Ответы [ 2 ]

4 голосов
/ 26 октября 2010

Префикс x: просто устанавливает атрибут из отдельного пространства имен:

В объявлениях пространства имен в корневой тег многих файлов XAML, вы увидим, что обычно есть два Объявления пространства имен XML. Первый Декларация отображает общий WPF пространство имен клиента / фреймворка XAML as по умолчанию:

XMLNS = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"

Второе объявление отображает отдельный Пространство имен XAML, отображающее его (обычно) к префиксу x:

XMLNS: х = "http://schemas.microsoft.com/winfx/2006/xaml"

Отношения между этими декларации, что префикс x: картографирование поддерживает то, что являются частью языка XAML определение, и WPF является одним реализация, которая использует XAML в качестве язык и определяет словарь его объекты для XAML. Потому что WPF использование словаря будет намного больше общие, чем присущие XAML использования, словарь WPF отображается по умолчанию

Итак, причина, по которой Name и x:Name работают на Border, заключается в том, что у Border есть свойство с именем Name. Он также поддерживает внутреннее использование XAML x:Name (именно это WPF использует для создания именованного экземпляра класса).

Однако SolidColorBrush не имеет свойства Name, поэтому он поддерживает только использование XAML x:Name.

1 голос
/ 22 июля 2016

В XAML действительно есть только одно имя, x: Name. Фреймворк, такой как WPF, может при желании отобразить одно из своих свойств в xAMName XAML, используя атрибут RuntimeNamePropertyAttribute для класса, который определяет одно из свойств классов как сопоставление атрибуту x: Name в XAML.

Причина, по которой это было сделано, состояла в том, чтобы позволить средам, которые уже имеют понятие «Имя» во время выполнения, таких как WPF. Например, в WPF FrameworkElement вводит свойство Name.

Как правило, классу не нужно хранить имя для x: Name, чтобы его можно было использовать. Все x: Name означает, что XAML создает поле для хранения значения в коде класса. То, что среда выполнения делает с этим отображением, зависит от структуры.

Итак, почему есть два способа сделать одно и то же? Простой ответ, потому что есть две концепции, отображенные на одно свойство. WPF хочет, чтобы имя элемента сохранялось во время выполнения (которое, среди прочего, можно использовать через Bind), а XAML нужно знать, какие элементы вы хотите получить доступ к полям в коде класса. WPF связывает их вместе, помечая свойство Name как псевдоним x: Name.

В будущем XAML будет более широко использоваться для x: Name, например, позволяя устанавливать свойства, ссылаясь на другие объекты по имени, но в 3.5 и более ранних версиях он используется только для создания полей.

Вопрос о том, следует ли вам использовать тот или иной вопрос - вопрос стиля, а не технического. Я оставлю это другим для рекомендации.

См. Также AutomationProperties.Name VS x: Name, AutomationProperties.Name используется инструментами специальных возможностей и некоторыми инструментами тестирования.

см. В чем разница между атрибутами x: Name и Name в WPF?

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