WPF简单的提示和技巧?

时间:2009-05-13 20:18:12

标签: wpf xaml

我在边缘和填充中鬼混,发现负值是可以接受的,并在适当的情况下产生很好的效果。例如,如果您有一个带有填充对象的边框,并且您希望填充的对象颜色超出边框。还有其他人吗?

15 个答案:

答案 0 :(得分:18)

调试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 更多信息here

爱丽儿

答案 1 :(得分:12)

与3.5 SP1一起提供的WPF的新功能是能够在绑定时格式化字符串。它消除了IValueConverter对这种常见场景的使用。 以下是我从this blog post

复制的一些示例
<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>

答案 2 :(得分:10)

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

  • 可见 - 元素被渲染并参与布局。
  • 折叠 - 元素不可见,不参与布局。有效地给它一个高度和宽度为0并表现得好像它不存在。
  • 隐藏 - 元素不可见但继续参与布局。

答案 3 :(得分: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">...

答案 4 :(得分:5)

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

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

答案 5 :(得分:5)

IsMouseOverIsMouseDirectlyOver是不同的事件。 IsMouseOver响应控件内的所有鼠标移动及其子项。仅当光标位于控件本身上时,IsMouseDirectlyOver才会响应。例如,如果边框中包含标签,则只有当光标位于边框本身但未覆盖包含的标签上时,边框的IsMouseDirectlyOver事件才会触发。

答案 6 :(得分: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或任何比例值。

答案 7 :(得分:3)

使用逗号分隔语法输入

PaddingMargin,其类型为“厚度”。它们可以输入为:

  • 填充=“5”(四边填充为5)
  • Padding =“5,10,15,20”(填充为左:5上:10右:15下:20)
  • Padding =“5,10”(左/右填充为5,顶部/底部为10)

答案 8 :(得分:3)

GridSplitter提供唯一的行或列,以确保其未被其他控件隐藏,并按预期运行。

答案 9 :(得分:2)

该属性为 BorderThickness 。无论您键入BorderWidth多少次,它都无法正常工作!

答案 10 :(得分:2)

在运行时根据另一个控件确定一个控件的尺寸。

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

这也可以通过Height/MaxHeight等完成。

答案 11 :(得分:1)

在内容中插入双引号:

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

答案 12 :(得分:0)

默认情况下保留Grid或使用Background画笔设置的Transparent将不会触发IsMouseOver事件,除非光标位于包含控件之上。要确保通过Grid本身触发事件,请通过将Transparency设置为容器Background颜色来模拟Background

答案 13 :(得分:0)

将背景设置为Transparent的控件不会触发IsMouseOver或IsMouseDirectlyOver事件。例如,如果边框背景设置为透明但BorderBrush =蓝色且BorderWidth是&lt;&gt; 0,MouseOver事件将在Border本身上方触发,但不会在控件内部触发。

答案 14 :(得分:0)

将Code Behind中的属性设置为DynamicResource:

Border_Toolbar.SetResourceReference(BackgroundProperty, "Brush_ToolbarBackground")