Элемент управления со свойством Text
может принимать только строку и отображается определенным образом, обработанным этим элементом управления. Примерами таких элементов управления являются TextBlock и TextBox .
Элементы управления со свойством Content
могут иметь буквально любой object
, установленный для этого свойства. Эти элементы управления обычно передают значение в свойство Content в ContentPresenter . В документации ContentPresenter Class есть этот соответствующий блок:
ContentPresenter использует следующую логику для отображения контента:
- Если свойство ContentTemplate в ContentPresenter установлен, ContentPresenter применяет этот DataTemplate к свойству Content и отображает результирующий UIElement и его дочерние элементы, если таковые имеются. Для получения дополнительной информации об объектах DataTemplate см. Обзор шаблонов данных.
- Если свойство ContentTemplateSelector в ContentPresenter установлено, ContentPresenter применяет соответствующий DataTemplate к свойству Content, и в результате отображаются результирующий UIElement и его дочерние элементы, если таковые имеются.
- Если существует DataTemplate, связанный с типом Content, ContentPresenter применяет этот DataTemplate к свойству Content и отображает результирующий UIElement и его дочерние элементы, если таковые имеются.
- Если Content является объектом UIElement, отображается UIElement. Если элемент UIElement уже имеет родителя, возникает исключение.
- Если существует TypeConverter, который преобразует тип контента в UIElement, ContentPresenter использует этот TypeConverter, и отображается результирующий UIElement.
- Если существует TypeConverter, который преобразует тип Content в строку, ContentPresenter использует этот TypeConverter и создает TextBlock для хранения этой строки. Отображается текстовый блок.
- Если содержимое является элементом XmlElement, значение свойства InnerText отображается в TextBlock.
- ContentPresenter вызывает метод ToString для Content и создает TextBlock для хранения строки, возвращаемой ToString. Отображается текстовый блок.
В случае класса TextBlock у вас есть возможность либо установить свойство Text
, либо установить свойство Inlines
. Установка Text
будет просто отображать текст. Настройка Inlines
(которая используется по умолчанию, если вы помещаете содержимое в тело тега xaml) позволяет форматировать текст. Например, вы можете использовать Run с его FontWeight , установленным в Bold
, чтобы сделать определенное слово или фразу жирным в предложении. Вы можете использовать LineBreak , чтобы вставить новую строку. Вы даже можете использовать InlineUIContainer для вставки пользовательских элементов интерфейса в текст. Все, что происходит от класса Inline , может входить в эту коллекцию.
TextBlock предназначен для простых бит форматированного текста. Если вам нужны еще более мощные функции стиля документа, вы можете обратиться к FlowDocument , который используется такими элементами управления, как RichTextBox , FlowDocumentScrollViewer и FlowDocumentReader [ 1 125]. [1 139] Что касается разницы между
и
, то на самом деле разницы нет. Это просто два разных способа, которыми вы можете установить свойства для чего-либо в файле xaml. Вторая версия обычно используется только тогда, когда вам нужно определить дополнительные элементы внутри сеттера.
Подобно @Relster, у меня есть фрагмент кода со следующими изменениями
#if DEBUG
if( node.Name == "Book" )
System.Diagnostics.Debugger.Break();
#endif
Where node.Name == "Book"
в зависимости от условия, которое я хочу проверить . Обертка #if DEBUG
гарантирует, что проверки никогда не дойдут до выпуска кода.
Это также намного быстрее, чем использование условных точек останова в Visual Studio. Когда вы используете встроенную условную bp, визуальная студия должна проникнуть в приложение, приостановить все потоки, оценить выражение и определить, истинно ли оно каждый раз, когда оно достигает точки останова. В тесном цикле это может быть разница между почти полной производительностью выполнения и бегом со сканированием.
Вы также можете сделать это в VS 2008. Я уверен, что есть много способов сделать это, но один из них - щелкнуть правой кнопкой мыши красную точку на краю существующей точки останова и выбрать условие ...
, а затем просто задать ему условие, которое оценивает на bool
, и он сломается, только если это правда. Условный оператор должен иметь доступ ко всему, что находится в области видимости в строке, где установлена точка останова.
В этом контекстном меню также есть другие параметры, которые позволяют фильтровать то, что вызовет разрыв (например, только определенные потоки), break в зависимости от количества срабатываний точки останова, запускать макросы при достижении точки останова и т. д.
Другой способ сделать это - создать свои собственные условия и использовать вызов:
System.Diagnostics.Debugger.Break();
Хотя он может быть не таким сложным, как способ установки точек останова в VS2010, вы можете получить тот же эффект с минимальными затратами кода. Просто не забудьте убрать эти вещи при сборке кода выпуска.
Примечание: в VS2008 и VS2005 вы можете установить условную точку останова, установив обычную точку останова (F9 или дважды щелкнув по желобу), а затем щелкнув правой кнопкой мыши по этой точке останова установить «условие ...». Возможность устанавливать условные точки останова НЕ доступна в VS2008 Express Edition.