WPF и XAML, в отличие от HTML, все о данные.
Лучший способ думать и рассуждать о любом пользовательском интерфейсе на основе XAML - это думать об данных, с которыми вам нужно показать и взаимодействовать.
В этом случае:
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();
}
}
Результат:
Обратите внимание, что я вообще не «касаюсь» пользовательского интерфейса в коде, это просто простые, простые свойства и DataBinding.
Какое значение имеет его текст? Кроме того, он спрашивает, есть ли «чистый» способ сделать это, вы, очевидно, могли бы просто бросить кучу текстовых полей над текстовым блоком, но это вряд ли удовлетворительно. –
Райан Сирл, он должен показать нам, что тогда мы можем помочь ему написать лучший код. Поскольку мы не знаем, что такое его код, как мы можем ему помочь?! И я должен сказать, что нет чистого кода для вопрос.Мы сравниваете код с другим, когда есть код! – Arash
@Arashjo Это простой текст без форматирования.Я обновил вопрос с помощью образца текста. Что касается кода, честно говоря, я понятия не имею, как программировать это. – Vahid