目录
1. 画刷
线性渐变画刷(LinearGradientBrush)
来源:《深入浅出WPF》P22
代码:
<Grid>
<StackPanel >
<Rectangle Name="rec" Width="400" Height="300" Margin="5">
<Rectangle.Fill>
<LinearGradientBrush>
<LinearGradientBrush.StartPoint>
<Point X="0" Y="0"/>
</LinearGradientBrush.StartPoint>
<LinearGradientBrush.EndPoint>
<Point X="1" Y="1"/>
</LinearGradientBrush.EndPoint>
<LinearGradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Offset="0.3" Color="LightPink"/>
<GradientStop Offset="0.6" Color="red"/>
<GradientStop Offset="1.0" Color="LightBlue"/>
</GradientStopCollection>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
</StackPanel>
</Grid>
效果:
径向渐变画刷(RadialGradientBrush)
<Ellipse Width="100" Height="100" Margin="0,20,0,0">
<Ellipse.Fill>
<RadialGradientBrush GradientOrigin="0.25,0.25" RadiusX="0.75" RadiusY="0.75">
<RadialGradientBrush.GradientStops>
<GradientStop Color="Wheat" Offset="0"/>
<GradientStop Color="Black" Offset="0.6"/>
<GradientStop Color="Gray" Offset="0.8"/>
</RadialGradientBrush.GradientStops>
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
效果:
2. 标记扩展
- 标记扩展就是特殊的Attribute=value的格式,value字符串是由一对花括号及其括起来的内容组成
如:
<TextBox Text="{Binding ElementName=slider1,Path=Value,Mode=OneWay}" Margin=5/>
- 编译器会自动将花括号里的内容解析成相应的对象
- 对象的数据类型名是紧邻左花括号的字符串,这里就是Binding数据类型
- 对象的属性是由一串以逗号连接的子字符串负责初始化,这里的属性包括ElementName,Path和Mode三个,等于号后边就是对其初始化的内容
- 只有MarkupExtension类的派生类(直接或间接均可)才能使用标记扩展语法来创建对象
,这些类有:- System.Windows.ColorConvertedBitmapExtension
- System.Windows.Data.BindingBase
- System.Windows.Data.RelativeSource
- System.Windows.DynamicResourceExtension
- System.Windows.Markup.ArrayExtension
- System.Windows.Markup.NullExtension
- System.Windows.Markup.StaticExtension
- System.Windows.Markup.TypeExtension
- System.Windows.ResourceKey
- System.Windows.StaticResourceKey
- System.Windows.TemplateBindingExtension
- System.Windows.ThemeDictinoaryExtension
- 标记语法是可以嵌套的
x:key 资源字典使用实例(后台访问资源字典)
- x:key的作用就是控件贴上了索引,很多时候可以把需要多次使用的内容提取出来放在资源字典里, 需要使用这个资源的时候就用它的key将它检索出来
在C#的后台代码里也可以是使用这个资源Resource:
private void Button_Click(object sender, RoutedEventArgs e)
{
string str = this.FindResorce("myString") as string;
this.textBox.Text = str;
}
// 自定义的访问资源字典的方法
private string FindResorce(string v)
{
return (string)Resources[v];
}
当按下button后,第二个textbox就会显示出Hello,WPF。
资源字典实例2
- 当不添加x:key时,默认是所有目标类型的控件都使用这个style:
<Window.Resources>
<Style TargetType="Button">
<Setter Property="Margin" Value="5"/>
<Setter Property="Foreground" Value="YellowGreen"/>
<Setter Property="Background" Value="DimGray"/>
<Setter Property="Width" Value="100"/>
<Setter Property="Height" Value="60"/>
<Setter Property="FontSize" Value="25"/>
</Style>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal">
<Button x:Name="button1" Content="button1"/>
<Button x:Name="button2" Content="button2"/>
<Button x:Name="button3" Content="button3"/>
<Button x:Name="button4" Content="button4"/>
</StackPanel>
</Grid>
使用自定义的控件
class MyButton : Button
{
public Type UserWindowType { get; set; }
protected override void OnClick()
{
base.OnClick();
Window win = Activator.CreateInstance(UserWindowType) as Window;
if (win != null)
{
win.ShowDialog();
}
}
}
<local:MyButton Content="Show" UserWindowType="{x:Type TypeName=local:MyWindow}" Margin="5"/>
- MyButton自定义类包含在当前项目的名称空间里,使用MyButton时要加上local前缀
x:NULL的使用
- 当需要显示的为一个属性赋空值时,当某个属性具有默认值,但是又不需要这个默认值时,就要显示的给这个属性设置null值
<Window.Resources>
<Style TargetType="Button">
<Setter Property="Width" Value="100"/>
<Setter Property="Height" Value="50"/>
<Setter Property="Margin" Value="5"/>
</Style>
</Window.Resources>
<StackPanel>
<Button Content="OK"/>
<Button Content="OK"/>
<Button Content="New" Style="{x:Null}"/> <!--希望这个属性值是null,而不是默认-->
</StackPanel>
x:Static的使用
- 在xaml代码中使用数据类型的static成员
例如在后台代码Window1里有两个数据成员
public partial class Window1 : Window
{
public static string WindowType = "山高月小";
public static string ShowText
{
get
{
return "水落石出";
}
}
public Window1()
{
InitializeComponent();
}
}
在xaml里怎么使用这两个静态数据呢?
Title="{x:Static local:Window1.WindowType}" Height="450" Width="800">
<StackPanel>
<TextBlock FontSize="50" Text="{x:Static local:Window1.ShowText}"/>
</StackPanel>
DataTemplate的使用实例1(以ListBox为例,含Binding)
数据驱动UI
- UI代码部分
<ListBox x:Name="listBox1">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Border Width="20" Height="20" Background="{Binding Code}"/>
<TextBlock Margin="10,0" Text="{Binding Name}" VerticalAlignment="Center"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
- 后台代码部分
public partial class DataTemplate : Window
{
public DataTemplate()
{
InitializeComponent(); // 程序入口
List<Color> text = new List<Color>();
text.Add(new Color() { Code = "#00FF00", Name = "绿色" });
text.Add(new Color() { Code = "#7093DB", Name = "中鲜黄色" });
text.Add(new Color() { Code = "#6B4226", Name = "半甜巧克力色" });
text.Add(new Color() { Code = "#6F4242", Name = "鲑鱼色" });
text.Add(new Color() { Code = "#855E42", Name = "中兰花色" });
text.Add(new Color() { Code = "#545454", Name = "淡灰色" });
listBox1.ItemsSource = text;
}
}
public class Color
{
public string Code { get; set; }
public string Name { get; set; }
}
- 效果
DataTemplate的使用实例2(以DataGrid为例,含Binding)
- UI部分
<Grid>
<DataGrid x:Name="grid" AutoGenerateColumns="False" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Code}" Header="Code"/>
<DataGridTextColumn Binding="{Binding Name}" Header="Name"/>
<DataGridTemplateColumn Header="操作">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<!--<StackPanel Orientation="Horizontal">
<Border Width="20" Height="20" Background="{Binding Code}"/>
<TextBlock Margin="10,0" Text="{Binding Name}"/>
</StackPanel>-->
<StackPanel Orientation="Horizontal">
<Button Content="删除"/>
<Button Content="复制"/>
<Button Content="保存"/>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
- 后台代码
public partial class DataTemplate : Window
{
public DataTemplate()
{
InitializeComponent();
List<Color> text = new List<Color>();
text.Add(new Color() { Code = "#00FF00", Name = "绿色" });
text.Add(new Color() { Code = "#7093DB", Name = "中鲜黄色" });
text.Add(new Color() { Code = "#6B4226", Name = "半甜巧克力色" });
text.Add(new Color() { Code = "#6F4242", Name = "鲑鱼色" });
text.Add(new Color() { Code = "#855E42", Name = "中兰花色" });
text.Add(new Color() { Code = "#545454", Name = "淡灰色" });
grid.ItemsSource = text;
}
}
public class Color
{
public string Code { get; set; }
public string Name { get; set; }
}
- 效果
Binding的几种类型
.1关于Binding的Mode属性的说明(Binding的四种模式)
参考自文章:Binding四种模式的说明
属性值 | 说明 | 常用场景 |
---|---|---|
Default | 使用绑定目标的默认 Mode 值。每个依赖项属性的默认值都不同,当不指定Mode属性时就是Default | 一般情况下,用户可编辑控件属性(例如文本框和复选框的属性)默认为双向绑定,而多数其他属性默认为单向绑定。确定依赖项属性绑定在默认情况下是单向还是双向的编程方法是:使用 GetMetadata 来获取属性的属性元数据,然后检查 BindsTwoWayByDefault 属性的布尔值。 |
OneTime | 只绑定第一次给定的值,无论以后有什么改变,这个值也不会更新;当应用程序启动或数据上下文更改时,更新绑定目标,而后不再改变; | 此绑定类型适用于以下情况:使用当前状态的快照适合使用的或数据状态实际为静态的数据。如果要从源属性初始化具有某个值的目标属性,并且事先不知道数据上下文,则也可以使用此绑定类型。实质上,这是 OneWay 绑定的较简单的形式,它在不更改源值的情况下可提供更好的性能。 |
OneWay | 单向绑定,只允许被绑定的一方改变主动绑定的一方;当绑定源更改时,更新绑定目标属性。 | 如果要绑定的控件为隐式只读控件,则适用此绑定类型。例如,可以绑定到如股市代号之类的源。或者,可能目标属性没有用于进行更改(例如表的数据绑定背景色)的控件接口。如果不需要监视目标属性的更改,则使用 OneWay 绑定模式可避免 TwoWay 绑定模式的系统开销。 |
OneWayToSource | 绑定的方向和OneWay相反;当目标属性更改时更新源属性。 | —— |
TwoWay | 双向绑定;当源属性或目标属性的其中一方发生变更时可自动更新另一方的Value | 此绑定类型适用于可编辑窗体或其他完全交互式 UI 方案。 |