WPF綁定控制寬度,以便它們總是相同的寬度WPF結合在運行時控制的寬度
我想Window的寬度綁定到另一個窗口控件的ActualWidth的。
到目前爲止,它只在顯示窗口時更新寬度一次,但不會隨着源控件更改寬度而更新寬度。
窗口1 DockPanel中控制,它具有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,但通過可能會有一個清理器辦法。
相反'私人無效Window_Loaded(對象發件人,RoutedEventArgs E)'的,使用'私人無效Window_SizeChanged(對象發件人,SizeChangedEventArgs e)' –
@無人願意鏈接到控制大小更改,但即使如此創建一個新的綁定對象在每個大小更改事件似乎都很奇怪。用這種方法,我傾向於使用這個代碼:'po.Width = dockBindSource.ActualWidth;' – rayzinnz