WPF简单技巧和窍门?

19

我在玩弄边距和内边距时发现负值是可以接受的,并且在适当的情况下可以产生不错的效果。例如,如果您有一个带有填充对象的边框,并且您想要填充对象的颜色超出边框。还有其他人有类似的经验吗?

15个回答

21

调试 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


更多信息链接已失效。 - mike

13

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>

10

Visibility 是一个三态枚举类型 System.Windows.Visibility:

  • Visible - 元素可见,参与布局。
  • Collapsed - 元素不可见,不参与布局。实际上,它的高度和宽度为0,就像不存在一样。
  • Hidden - 元素不可见,但仍然参与布局。

7

设置一个提供视觉提示的调试样式:

<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">...

6

在控件的内容中包含花括号。

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

6

IsMouseOverIsMouseDirectlyOver是不同的事件。 IsMouseOver 响应控件及其子控件内所有鼠标移动,而IsMouseDirectlyOver仅在光标直接位于控件上方时响应。例如,如果您在边框中包含一个标签,则只有当光标位于边框本身而非包含的标签上时,IsMouseDirectlyOver 事件才会被触发。


1
不确定你的回答是否回答了原问题,但它确实澄清了我所寻找的内容。 (+1) - jpierson

3

将可用房地产计算为百分比:

<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或任何比例值。


3

这个属性是BorderThickness。无论您输入多少次BorderWidth,它都不会起作用!


3

PaddingMargin使用逗号分隔的语法输入,类型为Thickness。可以输入如下:

  • Padding="5" (四个方向的内边距均为5)
  • Padding="5,10,15,20" (左:5 上:10 右:15 下:20)
  • Padding="5,10" (左/右:5 上/下:10)

您还可以通过简单的空格来分隔它们。Padding="5 10 15 20" - Andrew Mikhailov

3

GridSplitter提供一个独特的行或列,以确保它不会被其他控件隐藏,并且按预期工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接