WPF绑定控件在运行时的宽度

时间:2017-08-30 04:04:50

标签: c# wpf xaml data-binding

WPF绑定控件宽度,因此它们始终具有相同的宽度

我想将Window的宽度绑定到另一个窗口上的控件的ActualWidth。

到目前为止,我只是在显示窗口时只更新宽度一次,但是在源控件更改宽度时不会更新。

具有DockPanel控件的窗口1,它具有我想要绑定的ActualWidth(实际上有多个控件,但为了简单起见,我只在这里放置了一个DockPanel):

<Window x:Class="Testing1.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:Testing1"
        mc:Ignorable="d"
        Title="WindowWithControl" Height="350" Width="525" Initialized="Window_Initialized" Loaded="Window_Loaded" Closed="Window_Closed">

    <Grid Name="gridMain">
        <Grid.RowDefinitions>
            <RowDefinition />
        </Grid.RowDefinitions>
        <DockPanel Name="dockBindSource" Grid.Row="0" >
        </DockPanel>
    </Grid>
</Window>

窗口2 - 这是我想要匹配上一个窗口中控件宽度的窗口。

<Window x:Class="Testing1.ProgressOverlay"
        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:Testing1"
        mc:Ignorable="d"
        Title="ProgressOverlay" Height="300" Width="300" ShowInTaskbar="False" Opacity="0.75" AllowsTransparency="True" WindowStyle="None">
    <Canvas Name="canvasPB" />
</Window>

用于测试绑定宽度的cs中的代码。我需要在运行时执行此操作,因为在设计时我不知道窗口将链接到哪个控件。

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    ProgressOverlay po = new ProgressOverlay();
    po.Owner = this;
    Binding b1 = new Binding();
    b1.Mode = BindingMode.OneWay;
    b1.Source = this.dockBindSource.ActualWidth;
    po.SetBinding(FrameworkElement.WidthProperty, b1);
    po.Show();
}

所有关于实现绑定的内容都是INotifyPropertyChanged的要求。我之前在自定义类上使用过它,但不确定如何在现有的控件类上使用它 我认为我需要在XML的这一部分中引发某种属性更改事件:<Canvas Name="canvasPB" />
否则,我将放弃绑定,只是将一个SizeChanged事件添加到Canvas,但通常可能会有更简洁的方法。

2 个答案:

答案 0 :(得分:2)

我不知道为什么,但似乎Window.Width上的绑定无效。建议的解决方法:将窗口设置为SizeToContent="Width"并将宽度绑定到窗口内容(canvasPB

Binding b1 = new Binding("ActualWidth");
b1.Mode = BindingMode.OneWay;
b1.Source = this.dockBindSource;
po.canvasPB.SetBinding(FrameworkElement.WidthProperty, b1);

答案 1 :(得分:1)

试试这个:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    ProgressOverlay po = new ProgressOverlay();
    po.Owner = this;
    Binding b1 = new Binding("ActualWidth");
    b1.Mode = BindingMode.OneWay;
    b1.Source = this.dockFilterClient;
    po.SetBinding(FrameworkElement.WidthProperty, b1);
    po.Show();
}

Binding的Source属性包含对绑定的源对象的引用,而其Path引用(可选嵌套的)源属性

带有字符串参数的Binding构造函数设置Path属性,相当于

b1.Path = new PropertyPath("ActualWidth");

在你的情况下。