WPF простые советы-хитрости?

Я дурачился с полями и отступами и обнаружил, что отрицательное значение было приемлемым и дает хороший эффект в соответствующих обстоятельствах. Например, если у вас есть граница с заполненным объектом, и вы хотите, чтобы цвет заполненного объекта перекрывал границу. У кого-нибудь есть другие?

15 ответов

Отладка привязки WPF.

Добавление трассировки для связанных свойств:

<Window …
 xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase"/>
    <TextBlock Text="{Binding Path=Caption, 
diagnostics:PresentationTraceSources.TraceLevel=High}"…/>

Вы получите в окне вывода более подробную информацию о привязке:

PropertyChanged event from SomeObject (hash=1)
SetValue at level 0 from SomeObject (hash= 1) using RuntimePropertyInfo(Field): 
'False'
TransferValue - got raw value 'False'
TransferValue - using final value 'False'

// РЕДАКТИРОВАТЬ Подробнее здесь.

Ariel

Новая функция WPF, поставляемая с 3.5 SP1, - это возможность форматировать строку при связывании. Это исключает использование IValueConverter для таких распространенных сценариев. Вот несколько примеров того, как я начал, которые я скопировал из этого поста в блоге.

<TextBox Text="{Binding Path=Double, StringFormat=F3}"/>
<TextBox Text="{Binding Path=Double, StringFormat=Amount: {0:C}}"/>
<TextBox Text="{Binding Path=Double, StringFormat=Amount: \{0:C\}}"/>
<TextBox>
  <TextBox.Text>
    <Binding Path="Double" StringFormat="{}{0:C}"/>
  </TextBox.Text>
</TextBox>

Visibility перечисление System.Windows.Visibility с тремя состояниями:

  • Видимый - элемент визуализируется и участвует в макете.
  • Свернутый - элемент невидим и не участвует в макете. Эффективно присваивая ему высоту и ширину 0 и ведя себя так, как будто его не существует.
  • Скрытый - элемент невидим, но продолжает участвовать в макете.

Установите стиль отладки, который обеспечивает визуальные подсказки:

<Window.Resources>

  <Style x:Key="DebugGrid" TargetType="Grid">
    <Style.Triggers>
      <Trigger Property="IsMouseOver" Value="True">
        <Setter Property="ShowGridLines" Value="True"/>
      </Trigger>
    </Style.Triggers>
  </Style>

</Window.Resources>

<Grid Name="Grid"
      Style="{StaticResource DebugGrid}"
      Background="Black">...

IsMouseOver а также IsMouseDirectlyOver это разные события. IsMouseOver реагирует на все движения мыши внутри элемента управления, и это дети. IsMouseDirectlyOver Отвечает только если курсор находится над самим элементом управления. Например, если у вас есть метка, содержащаяся в рамке, IsMouseDirectlyOver Событие для Границы срабатывает только в том случае, если курсор находится над самой Границей, но НЕ над содержащейся Меткой.

Включите фигурные скобки в содержимое элемента управления.

<Button Content="{}{This is not a markup extension.}"/>

Предоставьте уникальную строку или столбец для GridSplitter убедиться, что он не скрыт другими элементами управления и ведет себя, как ожидается.

Padding а также Margin вводятся с использованием разделенного запятыми синтаксиса и имеют тип Thickness. Они могут быть введены как:

  • Заполнение ="5" (Заполнение 5 со всех четырех сторон)
  • Обивка ="5,10,15,20" (отступы слева: 5 сверху: 10 справа: 15 снизу: 20)
  • Заполнение ="5,10" (Заполнение - 5 слева / справа и 10 сверху / снизу)

Рассчитайте доступную недвижимость в процентах:

<Grid.RowDefinitions>
  <RowDefinition Height="0.25*"/>
  <RowDefinition Height="0.25*"/>
  <RowDefinition Height="0.25*"/>
  <RowDefinition Height="0.25*"/>
</Grid.RowDefinitions>

РЕДАКТИРОВАТЬ:

Это работает, но не указывает на то, как функционирует параметр *. Это:

<Grid.RowDefinitions>
  <RowDefinition Height="*"/>
  <RowDefinition Height="*"/>
  <RowDefinition Height="*"/>
  <RowDefinition Height="*"/>
</Grid.RowDefinitions>

обеспечивает ту же функциональность. Если вы хотите что-то кроме строк одинаковой высоты, вы можете использовать:

<Grid.RowDefinitions>
  <RowDefinition Height="1*"/>
  <RowDefinition Height="2*"/>
  <RowDefinition Height="3*"/>
  <RowDefinition Height="4*"/>
</Grid.RowDefinitions>

который разделит доступную высоту на 10 и сохранит относительную высоту каждого ряда. В качестве альтернативы, значения могут быть 0,1, 0,2, 0,3 и 0,4 или любое пропорциональное значение.

Свойство BorderThickness. Независимо от того, сколько раз вы наберете BorderWidth, это не сработает!

Определите размеры одного элемента управления на основе другого во время выполнения.

<... Width="{Binding ElementName=referenceElement, Path=ActualWidth}" ../>

Это может быть сделано с Height/MaxHeight и т. д.

Вставьте двойные кавычки в содержание:

<Button Name="Button"
        Background="AntiqueWhite"
        Content="{}{Background=&#0034;AntiqueWhite&#0034;}"/>

Grid с Background оставить по умолчанию или установить с Transparent кисть не уволит IsMouseOver событие, если курсор не находится над элементом управления. Чтобы убедиться, что событие происходит над Grid сам симулируй Transparency установив Background в контейнер Background цвет.

Элемент управления с фоном, установленным в Transparent, НЕ будет запускать события IsMouseOver или IsMouseDirectlyOver. Например, если для Border Background установлено значение Transparent, но BorderBrush=Blue и BorderWidth равно <> 0, события MouseOver будут срабатывать, когда над самой границей, но не над внутренней частью элемента управления.

Установите свойство в Code Behind для DynamicResource:

Border_Toolbar.SetResourceReference(BackgroundProperty, "Brush_ToolbarBackground")
Другие вопросы по тегам