2017-08-30 16 views
0

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,但通過可能會有一個清理器辦法。

+0

相反'私人無效Window_Loaded(對象發件人,RoutedEventArgs E)'的,使用'私人無效Window_SizeChanged(對象發件人,SizeChangedEventArgs e)' –

+0

@無人願意鏈接到控制大小更改,但即使如此創建一個新的綁定對象在每個大小更改事件似乎都很奇怪。用這種方法,我傾向於使用這個代碼:'po.Width = dockBindSource.ActualWidth;' – rayzinnz

回答

1

我不知道爲什麼,但看起來Window.Width上的綁定不起作用。提出的解決方法:窗口設置爲SizeToContent="Width"和寬度綁定到窗口內容(canvasPB

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

謝謝。驚人的簡單解決方案。很高興知道'Window.Width'上的綁定不起作用! – rayzinnz

+0

解決方案的第二部分是將它放到窗口xaml中,以便窗口寬度調整爲畫布寬度:'SizeToContent =「Width」' – rayzinnz

+1

@rayzinnz(編輯)啊,您現在閱讀重要部分:) – grek40

0

嘗試這種情況:

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(); 
} 

綁定的Source屬性保存到源對象結合的的引用,而其Path引用(任選地嵌套)源屬性

用字符串參數綁定構造函數將Path財產,相當於

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

你的情況。

+0

不,這不起作用。與其他代碼相同的結果 - 在調整大小期間寬度不會更新。 – rayzinnz

+0

綁定必須是雙向的。但是,這不適用於ActualWidth,因爲它是隻讀的。你應該有一個視圖模型屬性。 – Clemens

+0

@Clemens爲什麼選擇TwoWay?用戶在代碼中表達了OneWay。它應該與ActualWidth一起使用。順便說一句,如果實際行爲必須是雙向綁定,我同意虛擬機是一個解決方案。 –