wpf之RelativeSource用法总结

前言

RelativeSource用于在绑定时相对于当前元素来定位绑定源,而不是使用 ElementName 或 DataContext,它主要有两种相对于当前元素来确定绑定源的方式,一种是将自己作为绑定源;另一种是指定绑定的控件类型,系统自动寻找自身的父控件,父控件的父控件,以此类推一层层往上寻找。

1、self

下面的代码中Button的Width属性采用绑定的方式,并且指定Path为Height属性,然后使用RelativeSource={RelativeSource self}来指定绑定的源就是自己,所以你能看到最后Button的宽度和高度是一样大。

csharp 复制代码
<Window x:Class="wpf之RelativeSource.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:wpf之RelativeSource"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <Grid Background="Blue"  >
        <Grid.RowDefinitions >
            <RowDefinition  Height="300"/>
            <RowDefinition  Height=" 1*"/>
        </Grid.RowDefinitions >
        <Grid Grid.Row="0" Background="Red" >
            <StackPanel Orientation="Vertical" >
                <Button  Height=" 100" Content=" 1"  Width="{Binding Path=Height, RelativeSource={RelativeSource self}}"/>
            </StackPanel >
        </Grid>
    </Grid >
</Window>

2、AncestorType

下面的代码中Button的Foreground 字体颜色属性采用绑定的方式,并且指定Path为Background 属性,然后第一个Button使用RelativeSource={RelativeSource AncestorType=Grid }来指定绑定的源的类型是Grid,这样系统就能自动寻找Button的父控件中第一个Grid的Background,最后也是为红色;第二个Button使用RelativeSource={RelativeSource AncestorType=Grid, AncestorLevel=2 }来指定绑定的源的类型是Grid,并且通过AncestorLevel=2来指定找到的第2个Grid才是最终要找的Grid,最后找到的Grid也就是最外层的Grid背景也就是蓝色,所以第2个Button的字体颜色就是蓝色。

csharp 复制代码
<Window x:Class="wpf之RelativeSource.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:wpf之RelativeSource"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <Grid Background="Blue"  >
        <Grid.RowDefinitions >
            <RowDefinition  Height="300"/>
            <RowDefinition  Height=" 1*"/>
        </Grid.RowDefinitions >
        <Grid Grid.Row="0" Background="Red" >
            <StackPanel Orientation="Vertical" >
                               <Button  Height="20"  Content=" 2"  Foreground ="{Binding Path=Background , RelativeSource={RelativeSource AncestorType=Grid }}"/>
                <Button  Height=" 20"  Content=" 2"  Foreground ="{Binding Path=Background , RelativeSource={RelativeSource AncestorType=Grid, AncestorLevel=2 }}"/>
            </StackPanel >
        </Grid>
    </Grid >
</Window>

马工撰写的年入30万+C#上位机项目实战必备教程(点击下方链接即可访问文章目录)

1、《C#串口通信从入门到精通》

2、《C#与PLC通信从入门到精通 》

3、《C# Modbus通信从入门到精通》

4、《C#Socket通信从入门到精通 》

5、《C# MES通信从入门到精通》

6、《winform控件从入门到精通》

7、《C#操作MySql数据库从入门到精通》

相关推荐
信息安全失业大专人员9 小时前
每日了解一个智能体-WorkBuddy
开发语言·ai·c#·智能体
呆呆敲代码的小Y9 小时前
【实战精选面试题】C# 面试题详细解答,按难易程度排序
android·java·游戏·c#·游戏开发·unity面试题·c#面试题
淡海水10 小时前
09-01-内存-Unity资源生命周期全景
unity·c#·游戏引擎·.netcore·gc
椒颜皮皮虾྅13 小时前
让 C# 读懂整张图:DeploySharp 驱动 PaddleOCR v4/v5/v6,打通 OCR 全流程
开发语言·人工智能·深度学习·学习·c#·ocr·cuda
昂好的day13 小时前
C# 同步异步与多线程:Thread / Task / 线程池一次讲透(上篇)
开发语言·windows·c#
avi911114 小时前
电影开源Jevdo - 源码介绍(vue版)没有android 和 没有wpf
android·wpf·框架·数据爬虫·meego·电影管理
吃一碗粉只付一碗钱1 天前
12-给SPA友好的401和403响应
c#·状态模式
caimouse1 天前
MonoDevelop 编译用户应用程序时调用的是哪个编译器
c#
will_net1 天前
apollo 站点部署&C#接入
开发语言·c#·apollo