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="AntiqueWhite"}"/>
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")