在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控件不能添加到两个不同的父控件。如果您希望在运行时添加项的副本,则需要完全创建一个新对象,而不是重用现有项。
也就是说,由于您的按钮表示配置设置,因此我建议您使用绑定到数据对象集合的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);