2011-11-28 53 views
0

我正試圖動態地將按鈕添加到我的DockPanel。我需要創建我的dockpanel中存在的相同按鈕。複製按鈕並將其添加到WPF/C中的dockpanel中#

<Button Name="ImageMoreButton" 
      DockPanel.Dock="Right" 
      Command="{Binding LaunchLookup}" 
      Style="{StaticResource ButtonStyle}" 
      Margin="2,0,2,0" 
      Padding="3" 
      Visibility="{Binding Definition.IsLookupImageButton, Converter={StaticResource boolToVisibilityConverter}}" 
      IsEnabled="{Binding Locked, Converter={StaticResource invertedBooleanConverter}}"> 
      <Image Name="button_image" Source="search_button_rest.png"/> 
</Button> 

這是我的C#代碼。

d.Name = VariableArg.Name + index; 
d.Margin = VariableArg.Margin; 

item.Command = ImageMoreButton.Command; 
item.Style = ImageMoreButton.Style; 
item.Name = ImageMoreButton.Name + index; 
item.Visibility = ImageMoreButton.Visibility; 
item.Padding = ImageMoreButton.Padding; 
item.Margin = ImageMoreButton.Margin; 
item.IsEnabled = ImageMoreButton.IsEnabled; 
item.Height = ImageMoreButton.ActualHeight; 
item.Width = ImageMoreButton.ActualWidth; 
DockPanel.SetDock(item, Dock.Right); 

讓我知道這是否是正確的方法。

+0

是你編碼做什麼?如果它不會忘記在您的表單中添加'item' – Flanfl

+0

您是否真的需要在代碼中動態執行此操作? 如果您只需要2個可能隱藏的按鈕,只需在XAML中編寫它們並操作'Visibility'即可。如果你需要爲某個集合中的每個項目設置一個按鈕,最好使用一個'ItemsControl'來爲你自動生成按鈕。 有關您的情況的其他信息,將不勝感激。 –

+0

不,我需要n個按鈕,具體取決於配置。 – user1069622

回答

0

如果你使用這個代碼很多,我建議你在Button類上定義一個擴展方法。像這樣:

public static class ButtonExtension 
    { 
     public static Button Clone(this Button myButton, int index) 
     { 
      var newButton = new Button 
           { 
            Command = myButton.Command, 
            Style = myButton.Style, 
            Name = myButton.Name + index, 
            Visibility = myButton.Visibility, 
            Padding = myButton.Padding, 
            Margin = myButton.Margin, 
            IsEnabled = myButton.IsEnabled, 
            Height = myButton.ActualHeight, 
            Width = myButton.ActualWidth 
           }; 
       return newButton; 
     } 
    } 

您可以使用後,如:

var newButton = ImageMoreButton.Clone(index); 
    DockPanel.SetDock(newButton, Dock.Right); 
+0

我是WPF的新手。請耐心等待我的天真問題。 通過直接賦值,按鈕中的Style和Command屬性的值是多少? – user1069622

+0

@ user1069622別擔心,它們將與原始按鈕上的相同。結果將是非常自然的。 –

+0

@ user1069622作爲Pavel Gatilov提到,因爲它是引用類型。他們會相似(分享相同的風格) – MBen

0

談到「更好的方式」,我建議你得到faimliar與MVVM Pattern,因爲它簡化了UI代碼的功能非常強大。而且,WPF編程似乎是一個廣泛的最佳實踐,因爲WPF具有良好的基礎設施。當然有一條學習曲線,但一旦你明白了,你就可以輕鬆解決這些難題。我可以提供一個樣本,但我不確定它會在這裏有用。

如果你現在需要一個解決方案,你可以使用你的代碼,它似乎很好。但是不要忘記向父母添加新控件:

parentPanel.Children.Add(item); 
1

WPF控件無法添加到兩個不同的父控件。如果您希望在運行時添加項目的副本,則需要完全創建一個新對象,而不是重新使用現有項目。這就是說,由於你的按鈕代表一個配置設置,所以我建議你使用類似ItemsControl的東西,它綁定到一組數據對象,其中Button被用作ItemTemplate

例如,假設您有一個名爲SettingsObservableCollection<MySetting>集合。然後,你可以寫下面的XAML代碼:

<ItemsControl ItemsSource="{Binding Settings}"> 

    <!-- ItemsPanelTemplate --> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <DockPanel /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 

    <!-- ItemContainerStyle --> 
    <ItemsControl.ItemContainerStyle> 
     <Style> 
      <Setter Property="DockPanel.Dock" Value="Right" /> 
     </Style> 
    </ItemsControl.ItemContainerStyle> 

    <!-- ItemTemplate --> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Button Command="{Binding DataContext.LaunchLookup, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" 
        Style="{StaticResource ButtonStyle}" 
        Margin="2,0,2,0" 
        Padding="3" 
        Visibility="{Binding Definition.IsLookupImageButton, Converter={StaticResource boolToVisibilityConverter}}" 
        IsEnabled="{Binding Locked, Converter={StaticResource invertedBooleanConverter}}"> 
       <Image Source="search_button_rest.png"/> 
      </Button> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

然後添加新的項目,只需將項目添加到ObservableCollection

Settings.Add(new MySetting()); 

對於使用ItemsControl其他例子,看看this post I wrote