【发布时间】:2012-02-29 09:35:38
【问题描述】:
我目前正在我的 WPF 应用程序中在运行时动态添加自定义标签控件。
如果需要,我有一个 WrapPanel 包装标签的内容(内容是动态设置的)。
一切正常,但我想“解开”标签。
前提是您可以在屏幕上的其他位置单击并拖动此标签(拖放功能不是这里的问题),这是一个更大的区域,因此应该只占一行。
实现这种功能的最佳方式是什么?
【问题讨论】:
标签: wpf wpf-controls
我目前正在我的 WPF 应用程序中在运行时动态添加自定义标签控件。
如果需要,我有一个 WrapPanel 包装标签的内容(内容是动态设置的)。
一切正常,但我想“解开”标签。
前提是您可以在屏幕上的其他位置单击并拖动此标签(拖放功能不是这里的问题),这是一个更大的区域,因此应该只占一行。
实现这种功能的最佳方式是什么?
【问题讨论】:
标签: wpf wpf-controls
解决此问题的最简单方法是为您的动态列表使用 ItemsControl 并动态更改其 ItemsPanelTemplate。这是我刚刚制作的完整工作代码...
MainWindow.xaml:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow"
Height="350"
Width="200">
<Window.Resources>
<ItemsPanelTemplate x:Key="wrapPanelTemplate">
<WrapPanel />
</ItemsPanelTemplate>
<ItemsPanelTemplate x:Key="stackPanelTemplate">
<StackPanel />
</ItemsPanelTemplate>
</Window.Resources>
<StackPanel>
<ItemsControl x:Name="itemsControl"
ItemsPanel="{StaticResource wrapPanelTemplate}">
<ListBoxItem Content="TESTTEST " />
<ListBoxItem Content="TESTTEST " />
<ListBoxItem Content="TESTTEST " />
<ListBoxItem Content="TESTTEST " />
</ItemsControl>
<Button Click="Button_Click" Content="Change Template Button"/>
</StackPanel>
MainWindow.xaml.cs:
namespace WpfApplication1
{
public partial class MainWindow : Window
{
ItemsPanelTemplate stackPanelTemp;
public MainWindow()
{
InitializeComponent();
stackPanelTemp = (ItemsPanelTemplate)(this.FindResource("stackPanelTemplate"));
}
private void Button_Click(object sender, RoutedEventArgs e)
{
itemsControl.ItemsPanel = stackPanelTemp;
}
}
}
希望这会有所帮助!
【讨论】: