在WPF/ c#中复制按钮并将其添加到dockpanel

本文关键字:添加 dockpanel 按钮 WPF 复制 | 更新日期: 2023-09-27 18:16:13

我正试图动态地将按钮添加到我的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);

在WPF/ c#中复制按钮并将其添加到dockpanel

WPF控件不能添加到两个不同的父控件。如果您希望在运行时添加项的副本,则需要完全创建一个新对象,而不是重用现有项。

也就是说,由于您的按钮表示配置设置,因此我建议您使用绑定到数据对象集合的ItemsControl之类的东西,Button用作ItemTemplate

例如,假设您有一个ObservableCollection<MySetting>集合称为Settings。然后可以编写以下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的例子,请看我写的

如果您经常使用此代码,我建议您在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);

谈到"更好的方法",我建议您熟悉MVVM模式,因为它在简化UI代码方面非常强大。此外,它似乎是WPF编程的一个广泛的最佳实践,因为WPF有很好的基础设施。当然有一个学习曲线,但一旦你理解了它,你就会很容易地解决这些难题。我可以提供一个示例,但我不确定它在这里是否有用。

如果你现在需要一个解决方案,你可以使用你的代码,这似乎很好。但是不要忘记给父控件添加新的控件:

parentPanel.Children.Add(item);