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,但通常可能会有更简洁的方法。
答案 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");
在你的情况下。