【问题标题】:How can I "unwrap" a control in WPF?如何在 WPF 中“展开”控件?
【发布时间】:2012-02-29 09:35:38
【问题描述】:

我目前正在我的 WPF 应用程序中在运行时动态添加自定义标签控件。

如果需要,我有一个 WrapPanel 包装标签的内容(内容是动态设置的)。

一切正常,但我想“解开”标签。

前提是您可以在屏幕上的其他位置单击并拖动此标签(拖放功能不是这里的问题),这是一个更大的区域,因此应该只占一行。

实现这种功能的最佳方式是什么?

【问题讨论】:

    标签: wpf wpf-controls


    【解决方案1】:

    解决此问题的最简单方法是为您的动态列表使用 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;
        }
    }
    }
    

    希望这会有所帮助!

    【讨论】:

    • 感谢您的回答!我怎么能一次只对一个标签执行此操作?
    • 您的应用程序中是否使用了 MVVM 模式?
    • 是的,在 Caliburn.Micro 的帮助下使用 MVVM。
    • 有点难以解释...对于您的“自定义标签”,创建一个虚拟机并将文本或任何属性绑定到虚拟机。创建该 VM 的 ObservableCollection。然后将标签包装在 DataTemplate 中,并在 ItemsControl 中使用 DataTemplate,并将 ItemsSource 绑定到 VM 的 ObservableCollection。之后,您可以从 ObservableCollection 添加/删除虚拟机,更改将自动反映在 UI 中。
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多