我想要实现的目标在Web应用程序中有点容易,但我一直在努力在WPF中实现它。
我想在WPF中加载一段文本,并用可编辑的文本框替换它的一些特定单词。我怎么能这样做?
以正确的方式实现这一目标的最佳策略是什么?
更新:
考虑以下文字。我希望在WPF中显示它而不是粗体字放置一些文本框。
你认识一个有钱有名的人吗?他是自信,受欢迎,还是 所有的时间 - 主流成功的缩影要么, on 另一方面,他强调,对他的生活选择有第二个想法,并且不确定 的生命意义?
答案 0 :(得分:4)
与HTML不同,WPF和XAML都是关于数据。
思考和推理任何基于XAML的UI的最佳方式是考虑您需要展示和交互的数据。
在这种情况下:
public class Word
{
public string Value { get; set; }
public bool IsEditable { get; set; }
}
代表我们的每一句话。然后你只需要一个这些列表:
public class ViewModel
{
public List<Word> Words { get; private set; }
public ViewModel()
{
var editableWords = new[] { "on", "of" };
var text = "Do you know someone rich and famous? Is he confident, popular, and joyful all of the time—the epitome of mainstream success? Or, on the other hand, is he stressed, having second thoughts about his life choices, and unsure about the meaning of his life?";
this.Words =
text.Split(' ')
.Select(x => new Word
{
Value = x,
IsEditable = editableWords.Contains(x.ToLower())
})
.ToList();
}
}
请注意我是如何将文字转换为List<Word>
并在需要的地方设置IsEditable
。
现在只需使用ItemsControl
来显示这些内容:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVis"/>
</Window.Resources>
<ItemsControl ItemsSource="{Binding Words}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="5,2,5,2">
<TextBlock Text="{Binding Value}"
VerticalAlignment="Center"/>
<TextBox Text="{Binding Value}"
Visibility="{Binding IsEditable, Converter={StaticResource BoolToVis}}"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Window>
最后,将DataContext设置为ViewModel的实例:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ViewModel();
}
}
结果:
请注意,我根本没有“触及”代码中的UI,这只是简单,简单的属性和DataBinding。