Я обманывал полями и дополнениями и обнаружил, что отрицательное значение приемлемо и дает хороший эффект при соответствующих обстоятельствах. Например, если у вас есть граница с заполненным объектом, и вы хотите, чтобы заполненный цвет объекта перекрывал границу. У кого-нибудь есть другие?
WPF простые советы и трюки?
Ответ 1
Отладка привязки 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'
//EDIT Подробнее здесь.
Ariel
Ответ 2
Новая функция 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>
Ответ 3
Установите стиль отладки, который предоставляет визуальные подсказки:
<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">...
Ответ 4
Visibility
является трехступенчатым System.Windows.Visibility перечислением:
- Видимый - элемент получает визуализацию и участвует в компоновке.
- Свернуто - элемент невидим и не участвует в макете. Эффективно давая ему высоту и ширину 0 и ведя себя так, как будто этого не существует.
- Скрытый - элемент невидим, но продолжает участвовать в макете.
Ответ 5
Включить фигурные скобки в содержимом элемента управления.
<Button Content="{}{This is not a markup extension.}"/>
Ответ 6
IsMouseOver
и IsMouseDirectlyOver
- разные события. IsMouseOver
отвечает на все движения мыши внутри элемента управления, а это дети. IsMouseDirectlyOver
отвечает только в том случае, если курсор находится над самим элементом управления. Например, если у вас есть метка, содержащаяся на границе, событие IsMouseDirectlyOver
для пограничной области запускается только в том случае, если курсор находится над самой границей, но НЕ над указанной меткой.
Ответ 7
Рассчитайте доступную недвижимость в процентах:
<Grid.RowDefinitions>
<RowDefinition Height="0.25*"/>
<RowDefinition Height="0.25*"/>
<RowDefinition Height="0.25*"/>
<RowDefinition Height="0.25*"/>
</Grid.RowDefinitions>
EDIT:
Это работает, но не указывает, как работает параметр *. Это:
<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 или любое пропорциональное значение.
Ответ 8
Padding
и Margin
вводятся с использованием синтаксиса с разделителями-запятыми и имеют тип Thickness. Их можно ввести как:
- Padding = "5" (Padding равно 5 на всех четырех сторонах)
- Padding = "5,10,15,20" (Padding Left: 5 Top: 10 Right: 15 Bottom: 20)
- Padding = "5,10" (Padding 5 слева/справа и 10 сверху/снизу)
Ответ 9
Предоставьте уникальную строку или столбец для GridSplitter
, чтобы убедиться, что она не скрыта другими элементами управления и ведет себя как ожидалось.
Ответ 10
Свойство BorderThickness. Независимо от того, сколько раз вы вводите BorderWidth, это не сработает!
Ответ 11
Определить размеры одного элемента управления на основе другого во время выполнения.
<... Width="{Binding ElementName=referenceElement, Path=ActualWidth}" ../>
Это можно сделать и с помощью Height/MaxHeight
и т.д.
Ответ 12
Вставить двойные кавычки в контенте:
<Button Name="Button"
Background="AntiqueWhite"
Content="{}{Background="AntiqueWhite"}"/>
Ответ 13
A Grid
с Background
слева по умолчанию или с кистью Transparent
не будет запускать событие IsMouseOver
, если курсор не находится над содержащим элементом управления. Чтобы убедиться, что событие запущено по самому Grid
, имитируйте Transparency
, установив цвет Background
в цвет контейнера Background
.
Ответ 14
Элемент управления с фоном, установленным на Transparent, не будет запускать события IsMouseOver или IsMouseDirectlyOver. Например, если для фона границы установлено значение Прозрачный, но BorderBrush = Синий и BorderWidth равен < > 0, события MouseOver будут срабатывать в то время как над самой границей, но не во внутренней части элемента управления.
Ответ 15
Задайте свойство в Code Behind to DynamicResource:
Border_Toolbar.SetResourceReference(BackgroundProperty, "Brush_ToolbarBackground")