让UserControl内的元素与主调Window等高

让UserControl内的元素与主调Window等高

关键是Binding的逻辑。

调用逻辑如下:

Window->UsrCtrl1->UsrCtrl2。现在想设置UsrCtrl2内元素与Window等高,就需要这样做

//UsrCtrl2
<UserControl x:Class="RyChart.Y"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:RyChart"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300" x:Name="YPnl">
    <Grid>
        <Canvas Width="25">
            <Rectangle HorizontalAlignment="Center" Width="10" 
                       Height="{Binding Path=Height,ElementName=YPnl}" 
                       Fill="Blue"></Rectangle>
        </Canvas>
    </Grid>
</UserControl>

/UsrCtrl1
<UserControl x:Class="RyChart.CurvePanel"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:RyChart"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="500" x:Name="CurvePnl">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="auto"></ColumnDefinition>
            <ColumnDefinition Width="7*"></ColumnDefinition>
        </Grid.ColumnDefinitions>

        <StackPanel Orientation="Horizontal" Grid.Column="0">
            <local:Y Background="Red" Height="{Binding ElementName=CurvePnl,Path=Height}"></local:Y>
        </StackPanel>
        
        <Grid Grid.Column="1">
            <Canvas Background="Transparent" Panel.ZIndex="0">
                <Rectangle Fill="Green" Width="30" Height="30" />
            </Canvas>
            <Canvas Background="Transparent" Panel.ZIndex="1">
                <Rectangle Fill="Blue" Width="30" Margin="35" Height="30" />
            </Canvas>
        </Grid>

    </Grid>
</UserControl>

/Window
<Window x:Class="WpfApplication1.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:WpfApplication1"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525"
        xmlns:usrCtrl="clr-namespace:RyChart;assembly=RyChart">
    <Grid>
        <!--<usrCtrl:CurvePanel Height="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window},Path=Height}"></usrCtrl:CurvePanel>-->
        <usrCtrl:CurvePanel Height="50"></usrCtrl:CurvePanel>
    </Grid>
</Window>

这样通过Binding,仅需在最外层设置UsrCtrl的高,就能控制内部元素的高了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在WPF中,可以使用UserControl来创建自定义的可重用控件,而操作Window的关键是在UserControl中获取对Window的访问权。 要在UserControl中操作Window,首先要在UserControl的代码文件中定义一个依赖属性,该依赖属性类型应为Window,用于保存对Window的引用。例如,可以定义一个名为"ParentWindow"的依赖属性。 然后,在UserControl的XAML文件中,可以将UserControl的父级控件设置为Window,并将该Window与依赖属性进行绑定。可以使用RelativeSource指定绑定的目标为父级窗口。例如,可以在UserControl的根元素上定义"ParentWindow"属性的绑定,绑定源可以为RelativeSource的FindAncestor指令,并指定AncestorType为Window。 接下来,在UserControl的代码文件中,可以使用"ParentWindow"属性来获取对Window的引用,从而可以对Window进行操作。例如,可以在UserControl的某个事件处理程序中使用"ParentWindow"属性来关闭Window,可以使用"ParentWindow.Close()"方法来关闭Window。 总之,要在WPF的UserControl中操作Window,需要先定义一个依赖属性来保存对Window的引用,然后在XAML文件中将UserControlWindow进行绑定,最后在代码中通过该属性来实现对Window的操作。 ### 回答2: 在WPF中,一个UserControl是一种重用的可视化元素,它可以包含其他控件和逻辑代码。可以通过各种方式操作UserControl来实现对Window的操作。 首先,可以通过在UserControl中使用事件来与Window进行通信。在UserControl中定义一个公开的事件,然后在Window中订阅这个事件。当UserControl中触发该事件时,Window中的事件处理程序将被调用,从而实现对Window的操作。 其次,可以通过依赖属性来实现UserControlWindow之间的数据绑定。在UserControl中定义一个依赖属性,然后在Window中将UserControl的某个属性与Window的属性进行绑定。当UserControl中的属性发生变化时,Window中的属性也会自动更新,从而实现对Window的操作。 另外,可以在UserControl中使用VisualTreeHelper类来查找Window的实例,并对其进行操作。通过递归遍历UserControl的子元素,可以在其中找到Window的实例,并进行相应的操作。 还可以通过在UserControl中使用Command来操作Window。定义一个Command,并在UserControl中的某个控件上绑定这个Command。当该控件被触发时,Command会被执行,然后可以在Command的执行方法中对Window进行操作。 最后,还可以通过在UserControl中使用基于消息的通信来操作Window。使用Messenger或EventAggregator等消息传递机制,UserControl可以发送一个消息,然后Window中的订阅者可以接收到这个消息并对Window进行操作。 综上所述,通过事件、数据绑定、遍历可视化树、命令和消息传递等方式,我们可以在UserControl中操作Window,实现丰富的交互和功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值