WPF中的属性赋值和对象属性赋值

x33g5p2x  于3个月前 转载在 其他  
字(4.3k)|赞(0)|评价(0)|浏览(91)

1、attribute的形式和对象属性赋值

attribute 的形式是最为简单的,就是直接在属性上赋值,如下红色背景部分:

<Window x:Class="MyWpf.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:MyWpf"xmlns:sys="clr-namespace:System;assembly=mscorlib"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <local:Human x:Key="human" Name="tom" Child="any"></local:Human>
    </Window.Resources>
    <Grid></Grid>
</Window>

这是最简单的,如果要将对象进行属性赋值,就需要用 TypeConverter ,比如上述代码中有 Human 类如下,对数据进行转换:

//使用HumanTypeConvert转换器
    [TypeConverter(typeof(HumanTypeConvert))]
    public classHuman
    {
        public string Name { get; set; }
        public Human Child { get; set; }
    }
    /// <summary>
    ///类型转换器
    /// </summary>
    public classHumanTypeConvert : TypeConverter
    {
        public override object? ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, objectvalue)
        {
            Human human = newHuman();
            human.Name =value.ToString();
            returnhuman;
        }
    }

然后就可以从 xamlresource 中获取 human 对象了:

//xaml中resource的key
var model = this.FindResource("human") asHuman;
if(model != null)
  {
var str =model.Name;
if(model.Child != null)
    {
      str +=model.Child.Name;
    }
    MessageBox.Show(str);
  }

 2、属性标签

像是一般的属性比如 Text=“xxx” 这种赋值是简单的,但是如果是以一个复杂的对象,比如对象的列表就做不到了。如下所示的 RectangleFill 属性,对象很复杂可以用 xx.xx 的形式进行赋值。

<Rectangle Width="50" Height="50" Stroke="Green">
  <!--属性可以用xx.xx的形式-->
  <Rectangle.Fill>
    <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
      <LinearGradientBrush.GradientStops>
        <GradientStop Offset="0.2" Color="LightBlue" />
        <GradientStop Offset="0.7" Color="DarkBlue" />
        <GradientStop Offset="1.0" Color="Blue" />
      </LinearGradientBrush.GradientStops>
    </LinearGradientBrush>
  </Rectangle.Fill>
</Rectangle>

 3、属性标签的扩展

我们可以通过资源加载的方式来给属性赋值,如下所示我们在 button 组件下定以了一个名叫 MyLinearGradientBrush 的资源,然后我们通过 DynamicResource 动态加载资源。

<Button Click="Button_Click" Width="200" Height="50" Name="button">
  <Button.Resources>
    <!--每个控件下也可以有资源,资源名称重复时取里的最近的资源类似html的css-->
    <LinearGradientBrush x:Key="MyLinearGradientBrush" StartPoint="0,0" EndPoint="1,1" >
      <GradientStop Offset="0.2" Color="LightBlue" />
      <GradientStop Offset="0.7" Color="DarkBlue" />
      <GradientStop Offset="1.0" Color="Blue" />
    </LinearGradientBrush>
  </Button.Resources>
  <!--属性标签可以更复杂属性赋值,但是会使代码变得复杂-->
  <Button.Content>
    <Rectangle Width="50" Height="50" Stroke="Green" Fill="{DynamicResource ResourceKey=MyLinearGradientBrush}">
    </Rectangle>
  </Button.Content>
</Button>

如果想要修改这个资源,则在后端代码如下:

//修改DynamicResource动态数据源            
  //var linearGradientBrush = this.Resources["MyLinearGradientBrush"] as LinearGradientBrush
  var linearGradientBrush = newLinearGradientBrush();
  linearGradientBrush.StartPoint = new System.Windows.Point(0, 0);
  linearGradientBrush.EndPoint = new System.Windows.Point(1, 1);
  linearGradientBrush.GradientStops.Add(new GradientStop(System.Windows.Media.Color.FromRgb(97,168,13), 0.5));
  linearGradientBrush.GradientStops.Add(new GradientStop(System.Windows.Media.Color.FromRgb(1, 2, 3), 1));
  //这里只能取到window下的资源
  //this.Resources["MyLinearGradientBrush"] = linearGradientBrush;
  //获取控件下的资源
  this.button.Resources["MyLinearGradientBrush"] = linearGradientBrush;

上面使用动态加载资源因为可以修改,使用StaticResource也可以加载资源但是一次加载不能修改,如下所示:

<Window.Resources>
        <sys:String x:Key="stringHello">Hello WPF!</sys:String>
    </Window.Resources>
    <Grid>
        <!--标签扩展,这里使用静态资源-->
        <TextBlock Height="24" Width="120" Background="LightBlue" Text="{StaticResource ResourceKey=stringHello}" Margin="20,0,0,0" HorizontalAlignment="Left" />
    </Grid>

相关文章