2011-11-28 55 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