WPF学习积累

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将它检索出来
    x: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:
    不适用x:key
<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使用实例

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; }
}
  • 效果
    DataTemplate使用实例2

Binding的几种类型

.1关于Binding的Mode属性的说明(Binding的四种模式)

参考自文章:Binding四种模式的说明

属性值说明常用场景
Default使用绑定目标的默认 Mode 值。每个依赖项属性的默认值都不同,当不指定Mode属性时就是Default一般情况下,用户可编辑控件属性(例如文本框和复选框的属性)默认为双向绑定,而多数其他属性默认为单向绑定。确定依赖项属性绑定在默认情况下是单向还是双向的编程方法是:使用 GetMetadata 来获取属性的属性元数据,然后检查 BindsTwoWayByDefault 属性的布尔值。
OneTime只绑定第一次给定的值,无论以后有什么改变,这个值也不会更新;当应用程序启动或数据上下文更改时,更新绑定目标,而后不再改变;此绑定类型适用于以下情况:使用当前状态的快照适合使用的或数据状态实际为静态的数据。如果要从源属性初始化具有某个值的目标属性,并且事先不知道数据上下文,则也可以使用此绑定类型。实质上,这是 OneWay 绑定的较简单的形式,它在不更改源值的情况下可提供更好的性能。
OneWay单向绑定,只允许被绑定的一方改变主动绑定的一方;当绑定源更改时,更新绑定目标属性。如果要绑定的控件为隐式只读控件,则适用此绑定类型。例如,可以绑定到如股市代号之类的源。或者,可能目标属性没有用于进行更改(例如表的数据绑定背景色)的控件接口。如果不需要监视目标属性的更改,则使用 OneWay 绑定模式可避免 TwoWay 绑定模式的系统开销。
OneWayToSource绑定的方向和OneWay相反;当目标属性更改时更新源属性。——
TwoWay双向绑定;当源属性或目标属性的其中一方发生变更时可自动更新另一方的Value此绑定类型适用于可编辑窗体或其他完全交互式 UI 方案。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亲爱的老吉先森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值