Wpf 这样的动态字符串控件可以用XAML编写吗?

Wpf 这样的动态字符串控件可以用XAML编写吗?,wpf,mvvm,Wpf,Mvvm,编辑-为了更好地表达我的实际问题,我修改了原文 我对在WPF应用程序中实现这样的控件感兴趣。基本上它是一个字符串集合——你可以在空白区域中单击,并键入一个新的字符串,并输入将提交一个新的项目到列表中。您可以单击“x”按钮删除项目 下面的截图来自一个网站,但我不得不想象我可以在WPF中实现同样的效果。似乎可以用一个样式化的列表框来完成,mabye 我遇到的最大问题是,当我试图查找它时,我甚至不知道这样的控件将被命名为什么,因此研究一直是一个非起点。我很沮丧,因为我无法开始研究这一点,因为我缺乏关

编辑-为了更好地表达我的实际问题,我修改了原文


我对在WPF应用程序中实现这样的控件感兴趣。基本上它是一个字符串集合——你可以在空白区域中单击,并键入一个新的字符串,并输入将提交一个新的项目到列表中。您可以单击“x”按钮删除项目

下面的截图来自一个网站,但我不得不想象我可以在WPF中实现同样的效果。似乎可以用一个样式化的列表框来完成,mabye

我遇到的最大问题是,当我试图查找它时,我甚至不知道这样的控件将被命名为什么,因此研究一直是一个非起点。我很沮丧,因为我无法开始研究这一点,因为我缺乏关于搜索内容的想法


我对此很好奇,所以我快速验证了一种方法的概念

我使用了绑定到项目集合的
ItemsControl

ItemsPanelTemplate
是一个
WrapPanel
,而
ItemTemplate
是一个自定义模板。还有一个
DataTrigger
用于将最后一项的模板更改为文本输入的无边框
TextBox

<Grid>
    <TextBox IsHitTestVisible="False" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" /> <!-- For Border -->
    <ItemsControl ItemsSource="{Binding Values}" Margin="4">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <ContentControl Content="{Binding}">
                    <ContentControl.Style>
                        <Style TargetType="{x:Type ContentControl}">
                            <Setter Property="ContentTemplate">
                                <Setter.Value>
                                    <DataTemplate>
                                        <Border BorderBrush="Gray" BorderThickness="1" CornerRadius="4" Padding="4">
                                            <TextBlock Text="{Binding SomeString}" />
                                        </Border>
                                    </DataTemplate>
                                </Setter.Value>
                            </Setter>
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Value}" Value="0">
                                    <Setter Property="ContentTemplate">
                                        <Setter.Value>
                                            <DataTemplate>
                                                <TextBox Text="{Binding SomeString}" BorderThickness="0" Padding="5" Width="50" />
                                            </DataTemplate>
                                        </Setter.Value>
                                    </Setter>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </ContentControl.Style>
                </ContentControl>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

采取类似措施并添加额外功能应该非常容易:

  • ItemTemplate
    可以更新,使其看起来像您拥有的一样。我猜
    IValueConverter
    用于将文本值转换为底部条形图的
    Color

  • ItemTemplate
    上的X按钮可以绑定到
    ICommand
    以从列表中删除项目,并且可以将当前对象绑定为
    CommandParameter
    以了解要删除的项目

  • 当TextBox发生更改时,可以使用PropertyChange通知来发出信号,指示它应该翻转开关,使列表中的最后一项成为“已保存”项,并为TextBox绑定添加另一个“新”项

总的来说,实现你想要的应该不会太难


这也是我喜欢与WPF合作的原因之一!几乎可以轻松地进行任何我想要的控制D

在我看来就像一张卡片。许多轴网可以切换到这样的视图。(我使用的是超网格,它可以做这样的卡片视图。(出于好奇,你在哪个网站上看到的?)。我不知道是否有现有控件,但我相信您可以使用类似的
ItemsControl
模板来为项目使用
WrapPanel
,并使用自定义的
ItemsPanelTemplate
。还可以自定义添加一个
TextBox
,在最末端没有边框用于文本输入。这是一个列表框或者使用WrapPanel对ItemsPanel进行ItemsControl。ItemsSource将绑定到一个可观察的集合
Color
String
、Int32(ARGB quad是32位)或漂浮在船上的任何内容。然后,给ItemTemplate一个DataTemplate,以颜色显示内容,并对delete按钮进行一些小的修改(这是一个带有ControlTemplate的按钮,显示了一个非常简单的路径)。不需要自定义控件。将其作为一种样式编写以供重用。这看起来像是一个卡片视图。许多“用于支付”控件套件有它们。下面是一个关于如何将列表视图转换为卡片视图的堆栈溢出答案:哦,我在考虑最后一个TextBox项,您甚至不需要任何自定义内容。只需使绑定项包含类似于
IsNewItem=True
,并使用DataTrigger使用无边框TextBox为该项绘制模板即可。然后,在更改文本后,可以将其更改为适当的项目,并在末尾添加另一个新项目:)