【发布时间】:2017-08-30 04:04:50
【问题描述】:
WPF 绑定控件宽度,所以它们总是相同的宽度
我想将一个窗口的宽度绑定到另一个窗口上控件的实际宽度。
到目前为止,它只在显示窗口时更新一次宽度,但不会随着源代码控制更改宽度而更新。
带有 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>
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" />
否则我将放弃绑定,只在 Canvas 中添加一个 SizeChanged 事件,但可能会有更简洁的方法。
【问题讨论】:
-
用
private void Window_Loaded(object sender, RoutedEventArgs e)代替private void Window_SizeChanged(object sender, SizeChangedEventArgs e) -
@Nobody 我更愿意链接以控制大小更改,但即便如此,在每个大小更改事件中创建一个新的绑定对象对我来说似乎还是很奇怪。使用这种方法,我倾向于使用以下代码:
po.Width = dockBindSource.ActualWidth;
标签: c# wpf xaml data-binding